与fgets()不等待输入(fgets() not waiting for input)

2019-06-23 15:22发布

我写了下面的代码:

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每次等待输入? 我觉得这是一个线程问题。

Answer 1:

作为geekosaur说,你不处理换行符留下scanf 。 您可以修改您的scanf的格式字符串,考虑到这一点:

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

*[^\n]说,无视你整数输入不是一个换行符之后的一切,但不换行(跳过)做任何事情。

测试程序的输出:

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


Answer 2:

它无关线程。 scanf()读取,你就问到底是什么; 它把其他所有未读,尤其是以下数据换行符。 (您还没有处理用户没有输入你打算什么的可能性。)

如果你想要做的面向行的输入,使用fgets() 不要使用scanf() ,并希望该系统能神奇直觉,你要不理你没读什么。



Answer 3:

您可以拨打电话到fflush()仅仅是scanf()的这样的后:

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

因此,从消除换行符GES stdin缓冲区,并在未来fgets()将停止,要求输入。



文章来源: fgets() not waiting for input
标签: c fgets