Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getchar关于EOF的奇怪行为_C - Fatal编程技术网

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
(取决于其符号的大小)。