C 程序在 EOF 检查时挂起

C Program hangs on EOF check

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

我能够使用 fgetc()

实现所需的行为
char c = fgetc(stdin);
while(index<size && c!=EOF){
  A[index] = c;
  index++;
  fgetc(stdin);
}

来自 fgetc 的手册页:"fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error." 我想 scanf 无法正确识别 EOF。 (见下文)

或者,使用 stdio.h 提供的 feof 函数:

while(index < size){
  c = fgetc(stdin);
  if(feof(stdin)) break;
}

通常建议对 I/O-Operations 使用 fgets() 系列函数,因为它们(大部分)比 scanf 更安全。

包含更多信息的手册页:fgetc、feof、scanf。

编辑:发布我的答案并阅读问题下的评论后:scanf() returns EOF (like fgetc) when encountering an end of file error .这意味着检查 scanf 的 return 值将解决问题,例如

while(index < size && scanf("%c", &c) != EOF){
//do stuff
}

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

的 return 代码
int rc = scanf("%c", &c);

它 return 是它成功读取的参数的数量,或者有时它 return 是 EOF。