C 程序在 EOF 检查时挂起

标签 c eof

我在 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 击键,但它甚至没有注册它。我在研究这个问题时没有发现任何东西,而且我很困惑为什么它有时会起作用(如果我按下它的次数足够多),而不是其他的。这是怎么回事?

最佳答案

scanffgetc 不同,从不将其参数设置为 EOF。如果 scanf 由于 eof 而无法读取其参数,它只是让它们保持不变。所以检查 c!=EOF 已经过时了。您可以检查 feof(stdin)。或者,您可以检查 scanf 的返回码:

int rc = scanf("%c", &c);

返回读取成功的参数个数,有时返回EOF。

关于C 程序在 EOF 检查时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37016746/

相关文章:

c++ - "Segmentation fault"与 "run time"错误?

c++ - 如何结束文件输出它的数据?

c++ - eof问题c++

c - 无限循环和带有 : while (chars = fgetc(map) ! = EOF 的奇怪字符)

EOF 可以与\n 在同一行吗

c - 如何在两个 C 程序之间发送变量

c++ - 如何围绕C 'class'概括此C++包装器?

c - 在头文件中定义变量 - C

c - fscanf() 遇到 EOF 后程序崩溃

c++ - ZMQ异步,具体是如何工作的?