2017-04-18 74 views
-3

我正在编写一个程序,它使用getchar从用户处获取字符并对它们进行计数。当用户输入EOF时,它应该停止,打印出字符数并打印完成。代码:关于EOF的getchar的奇怪行为

char cur = 0; 
int count = 0; 
while((cur = getchar()) != EOF){ 
    ++count; 
} 
printf("\n%d", count); 
printf("\ndone\n"); 

但是,循环不停止,直到用户输入2个连续的EOF。 我试图强制循环停止通过手动检查如果字符是EOF和打破循环,但它似乎并没有工作。

如何在一次EOF后停止?

+0

用户如何“输入”EOF?这不是关键,而是以某种方式发出信号的条件。你按什么键? – chux

+1

键入的EOF键(Linux上的“Ctrl-D”,Windows上的Ctrl-Z)必须是'newline'后面的第一个字符。即使如此,我还没有弄清楚它为什么有时需要键盘上的一个以上'EOF'。 –

+1

我在Linux上使用CTRL + D –

回答

2

getchar函数声明返回int而不是char。因为您将结果分配给char,您将无法捕获EOF。

将数据类型cur更改为int

编辑:

这很可能与您的终端如何处理EOF有关。当我测试这个时,如果我在一行中输入一个或多个字符,然后按CTRL-D,则字符(减去CTRL-D)将被发送到程序并由getchar读取。如果我自己按CTRL-D一行,即使按ENTER键输入上一行,然后检测到EOF。

如果您要将文件重定向到该程序的stdin中,您会看到在到达文件末尾时会检测到EOF。

+2

因此,如果第一个EOF不能从字符中识别,那么为什么第二个? – Yunnosch

+0

谢谢,像魔术一样被唤醒,但这个问题仍然令我感兴趣,为什么第二次工作,但不是第一次? –