我写了以下代码:
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
每次都等待输入?我觉得这是一个线程问题。
答案 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()
将停止请求输入。