3

我写了以下代码:

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似乎不是第一次等待标准输入。我总是得到 的输出-,然后它等待输入。意思是,循环的第一次迭代,它不是在等待标准输入,而是像 myfgets一样打印出两个由分隔的空字符。-printf

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

4

3 回答 3

6

fflush()您可以在 scanf() 之后拨打电话,如下所示:

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

所以换行符从stdin缓冲区中删除,下一个fgets()将停止请求输入。

于 2013-11-20T00:55:55.827 回答
5

正如geekosaur所说,您没有处理scanf. 您可以修改scanf格式字符串以将其考虑在内:

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

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

测试程序输出:

emulawsk@cs:~/testing$ ./test2
3
13
1 - 3
26
2 - 6
59
5 - 9
于 2012-04-14T19:41:10.110 回答
3

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

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

于 2012-04-14T19:36:25.043 回答