我在 Linux 终端上工作,我正在编写一个程序,要求用户在输入结束时按 CTRL-D 以表示输入结束。即使我正在按下 CTRL-D 按钮,程序也会卡在 while 循环中等待另一个输入扫描。最奇怪的是,如果我按下它的次数足够多,它就会将 EOF 击键注册并存储到我的变量中,然后正确地完成程序。
我的代码片段:
char c;
scanf("%c",&c);
while(index<size && c!=EOF){
A[index] = c;
index++;
scanf("%c",&c);
}
我在 gdb 中单步执行我的程序,每次我输入我的输入并扫描所有内容时,它会等待更多输入,此时我使用 CTRL-D 击键,但它甚至没有注册它。我在研究这个问题时没有发现任何东西,而且我很困惑为什么它有时会起作用(如果我按下它的次数足够多),而不是其他的。这是怎么回事?
最佳答案
scanf
与 fgetc
不同,从不将其参数设置为 EOF
。如果 scanf
由于 eof 而无法读取其参数,它只是让它们保持不变。所以检查 c!=EOF
已经过时了。您可以检查 feof(stdin)
。或者,您可以检查 scanf
的返回码:
int rc = scanf("%c", &c);
返回读取成功的参数个数,有时返回EOF。
关于C 程序在 EOF 检查时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37016746/