c 将任意长度的多行的输入打印到控制台,前面加上行号

如题。

发现 c 里面即使是很简单的问题处理起来都是比较麻烦的。比如标题里面的这个小问题。

这个问题首先要分析。

  1. 既然是任意长度,定义固定长度的数组去接收输入就不合适了。malloc 也不行,还是因为不知道大小,不知道 malloc 多大的内存。
  2. 既然这样,我想到使用 putchar()/ getchar() 这组函数去实现。

如果使用这组函数去实现的话,需要注意一个问题,就是所谓的缓冲区问题。什么是缓冲区问题?就是我调用 getchar() 之后,就可以在控制台输入了,但是无论我是输入一个字符还是一行字符,这个函数并没有完成调用。直到按下回车键,它才会去获取我输入的第一个字符。

既然如此,在设计行号打印的时候就要特别注意打印行号的时机。

要想到,在输入一行数据直到回车,才会传给 getchar(), 然后这时就开始执行 while 逻辑,不停的get 然后 put. 第二行的输入也是如此。行号一般肯定是在前面打印的,那么,通过两个变量去控制行号的打印时机,就是 curr,last 。每次换行就给 curr+1。last 什么时候+1?肯定要在打印过行号之后了。打印行号的时机就是 curr != last 的时候。
… 表达的可能不是很好,不过代码还算比较清晰。

思考的过程有点费脑,但是代码很简单,直接给出实现。

#include <stdio.h>
#include <stdlib.h>

#define LINE '\n'

int main(int argc, char *argv[])
{
    printf("%s\n", "input any long lines,you can:");
    int ch;
    int curr = 1, last = 0;
    while ((ch = getchar()) != EOF)
    {
        if (ch == LINE)
        {
            curr += 1;
        }
        else
        {
            if (curr > last)
            {
                printf("\t%d: ", curr);
            }
            if (last != curr)
            {
                last = curr;
            }
        }
        putchar(ch);
    }

    return EXIT_SUCCESS;
}

// fffhhhh\n
// 1fffhhhh\n
// dsdsddsd\n
// 2

输出效果如下:

input any long lines,you can:
weqqqq
        1: weqqqq
swwe
        2: swwe
how old are you'
        3: how old are you'
^D

以上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值