fgets()不等待输入
我写了以下代码:
int N; scanf("%d", &N); int i; for (i = 0; i < N; i++) { char line[LINE_MAX]; if (fgets(line, LINE_MAX, stdin) != NULL) { // do stuff with line here printf("%c - %c\n", line[0], line[1]); } }
我有一个输入文件,它具有它拥有的行数,然后是我想要处理的行数。 所以我读了N
行的行数。 在那之后,我使用fgets
来获得能够处理它的线。
但是, fgets
似乎并没有第一次等待stdin。 我总是输出-
,然后等待输入。 意思是,循环的第一次迭代,它不是在等待fgets
标准输入,只是打印出两个空字符-
由我的printf
分隔。
这是为什么? 我怎样才能让fgets
每次都等待输入? 我觉得这是一个线程问题。
正如geekosaur所说,你没有处理scanf
留下的换行符。 您可以修改scanf
格式字符串以将其考虑在内:
scanf("%d *[^\n]", &N);
*[^\n]
表示忽略整数输入后不是换行符的所有内容,但不对换行符做任何操作(跳过它)。
测试程序输出:
emulawsk@cs:~/testing$ ./test2 3 13 1 - 3 26 2 - 6 59 5 - 9
它与线程无关。 scanf()
准确读出你的要求; 它将其他所有内容都保留为未读,特别是数据后面的换行符。 (您也没有处理用户没有输入您想要的内容的可能性。)
如果要进行面向行的输入,请使用fgets()
。 不要使用scanf()
并希望系统能够神奇地想要忽略你没有读过的内容。
您可以在scanf()之后调用fflush()
,如下所示:
int N; scanf("%d", &N); fflush (stdin); int i; ... (rest of code)...
因此换行字符ges从stdin
缓冲区中删除,下一个fgets()
将停止请求输入。