C程序挂起EOF检查
我在Linux终端上工作,我正在编写一个程序,要求用户在输入结束时按CTRL-D键表示输入结束。程序挂起while循环,等待另一个输入进行扫描,即使我按下了CTRL-D按钮。最奇怪的是,如果我按下它足够的次数,它会将EOF击键注册并存储到我的变量中,并正确地完成程序 我的代码片段:C程序挂起EOF检查,c,eof,C,Eof,我在Linux终端上工作,我正在编写一个程序,要求用户在输入结束时按CTRL-D键表示输入结束。程序挂起while循环,等待另一个输入进行扫描,即使我按下了CTRL-D按钮。最奇怪的是,如果我按下它足够的次数,它会将EOF击键注册并存储到我的变量中,并正确地完成程序 我的代码片段: char c; scanf("%c",&c); while(index<size && c!=EOF){ A[index] = c; index++; scanf
char c;
scanf("%c",&c);
while(index<size && c!=EOF){
A[index] = c;
index++;
scanf("%c",&c);
}
charc;
scanf(“%c”、&c);
而(indexI能够使用fgetc()
通常建议使用fgets()
函数系列进行I/O操作,因为它们(大部分)比scanf
更安全
包含更多信息的手册页:fgetc、feof、scanf
编辑:发布我的答案并阅读问题下的注释后:当遇到文件结束错误时,scanf()返回EOF(如fgetc)。这意味着检查scanf的返回值将解决问题,例如
while(index < size && scanf("%c", &c) != EOF){
//do stuff
}
while(索引scanf
与fgetc
不同,它从不将参数设置为EOF
。如果scanf
由于EOF而无法读取其参数,它只会将其保持不变。因此检查c!=EOF
是过时的。您可以检查feof(stdin)
。或者,您可以检查scanf的返回代码:
int rc = scanf("%c", &c);
它返回它成功读取的参数数,或者有时返回EOF。有效!关于我的另一个表示法为什么不能可靠工作,有什么想法吗?你认为幕后发生了什么?scanf不能返回EOF。fgetc()
返回int
,而不是char
。使用!feof(stdin)
以这种方式是一个典型错误。Linux中没有“EOF字符”。fgetc()
至少在文档正确的情况下,将字符转换为int。为什么在这里使用feof()
是错误的?
while(index < size && scanf("%c", &c) != EOF){
//do stuff
}
int rc = scanf("%c", &c);