getchar关于EOF的奇怪行为
我正在编写一个程序,使用getchar关于EOF的奇怪行为,c,C,我正在编写一个程序,使用getchar从用户那里获取字符,并对其进行计数。当用户输入EOF,打印出字符数并打印完成时,它应该停止。守则: char cur = 0; int count = 0; while((cur = getchar()) != EOF){ ++count; } printf("\n%d", count); printf("\ndone\n"); 但是,直到用户连续输入2个EOF,循环才会停止。 我试图通过手动检查char是否为EOF并中断循环来强制循环停止,但它似
getchar
从用户那里获取字符,并对其进行计数。当用户输入EOF,打印出字符数并打印完成时,它应该停止。守则:
char cur = 0;
int count = 0;
while((cur = getchar()) != EOF){
++count;
}
printf("\n%d", count);
printf("\ndone\n");
但是,直到用户连续输入2个EOF,循环才会停止。
我试图通过手动检查char是否为EOF并中断循环来强制循环停止,但它似乎不起作用
如何使它在一次EOF后停止?函数声明为返回
int
,而不是char
。由于将结果分配给字符
,因此无法捕获EOF
将cur
的数据类型更改为int
编辑:
这很可能与终端处理EOF的方式有关。当我测试这个时,如果我在一行中输入一个或多个字符,然后按CTRL-D,字符(减去CTRL-D)将被发送到程序并由getchar
读取。如果我单独在一行上按CTRL-D键,即使我按ENTER键输入前一行,也会检测到EOF
如果您要将文件重定向到此程序的stdin,您会看到当到达文件末尾时会检测到EOF。因此,如果无法从字符中识别第一个EOF,那么为什么第二个EOF会被识别?谢谢,我非常好奇,但我仍然感兴趣的问题是,为什么第二次有效而第一次无效?用户如何“输入”
EOF
?它不是一个键,而是以某种方式发出信号的条件。您按了哪些键?键入的EOF
键(Linux上为Ctrl-D
,Windows上为Ctrl-Z
)必须是换行符后的第一个字符。即使这样,我也不明白为什么它有时需要不止一个来自键盘的EOF
Linux@MichaelSapozhnikov我想知道如何输入(char)4
(一个“控件D”)作为键盘输入?getchar
返回一个int
,不是char
,并且EOF
或全字符代码不能放入char
(取决于其符号的大小)。