我正在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按键,但它甚至没有注册它。我没有找到任何研究这个问题的东西,我很困惑为什么它有时会起作用(如果我按它足够多次),而不是其他人。发生了什么事?
答案 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
}