fgets()不等待输入

时间:2012-04-14 19:33:29

标签: c 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似乎没有第一次等待标准输入。我总是得到-的输出,然后它等待输入。意思是循环的第一次迭代,它不等待fgets处的标准输入,只打印出两个由-分隔的printf空字符。

为什么?我怎样才能让fgets每次都等待输入?我觉得这是一个线程问题。

3 个答案:

答案 0 :(得分:4)

正如 geekosaur 所说,你没有处理scanf留下的换行符。您可以修改scanf格式字符串以将其考虑在内:

scanf("%d *[^\n]", &N);

*[^\n]表示在整数输入之后忽略所有不是换行符,但不对换行符做任何操作(跳过它)。

测试程序输出:

emulawsk@cs:~/testing$ ./test2
3
13
1 - 3
26
2 - 6
59
5 - 9

答案 1 :(得分:2)

它与线程无关。 scanf()准确读出你要求的内容;它将其他所有内容都保留为未读,特别是数据后面的换行符。 (您也没有处理用户没有输入您想要的内容的可能性。)

如果您想进行面向行的输入,请使用fgets()。不要使用scanf()并希望系统能够神奇地想要忽略你没有读过的内容。

答案 2 :(得分:1)

您可以在scanf()之后调用fflush(),如下所示:

int N;
scanf("%d", &N);
fflush (stdin);
int i;
... (rest of code)...

因此,新行字符ges将从stdin缓冲区中删除,而下一个fgets()将停止请求输入。