C程序挂起EOF检查

时间:2016-05-04 00:58:27

标签: c eof

我正在Linux终端中工作并且我正在编写一个程序,要求用户在输入结束时按CTRL-D表示输入结束。程序挂起while循环等待另一个输入扫描,即使我按下CTRL-D按钮。最奇怪的部分是,如果我按下它足够多次,它将注册并将EOF击键存储到我的变量中,并正确完成程序。

我的代码段:

char c;
scanf("%c",&c);
while(index<size && c!=EOF){
    A[index] = c;
    index++;
    scanf("%c",&c);
}

我在gdb中逐步执行了我的程序,每次输入输入并扫描完所有内容时,它都会等待更多输入,此时我使用CTRL-D按键,但它甚至没有注册它。我没有找到任何研究这个问题的东西,我很困惑为什么它有时会起作用(如果我按它足够多次),而不是其他人。发生了什么事?

2 个答案:

答案 0 :(得分:1)

scanf不同,

fgetc永远不会将参数设置为EOF。如果scanf由于eof而无法读取其参数,则只会保持不变。所以检查c!=EOF已经过时了。您可以查看feof(stdin)。或者,您可以查看scanf的返回代码:

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

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

答案 1 :(得分:-2)

我能够使用fgetc()

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

在fgetc的手册页中:“fgetc()从流中读取下一个字符,并将其作为无符号字符串转换为int,或者在文件末尾或错误时返回EOF。”我猜scanf无法正确识别EOF。 (见下文)

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

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

通常建议将fgets()系列函数用于I / O操作,因为它们(大多数)比scanf更安全。

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

编辑:发布我的答案并阅读问题下的评论后:scanf()在遇到文件结束错误时返回 EOF(如fgetc)。这意味着检查scanf的返回值将解决问题,例如

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