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()将停止请求输入。