C程序挂起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

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

我的代码片段:

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);