如题。
发现 c 里面即使是很简单的问题处理起来都是比较麻烦的。比如标题里面的这个小问题。
这个问题首先要分析。
- 既然是任意长度,定义固定长度的数组去接收输入就不合适了。malloc 也不行,还是因为不知道大小,不知道 malloc 多大的内存。
- 既然这样,我想到使用
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
以上。