与当前代码混淆。 在大学学习,并通过由Brian W. Kernighan的现在尝试打印出所有输入字符的getchar()!= EOF的返回
我一直在编程了好几年,主要在C++和Java的一点目前打算C程序设计语言(第二版),但是不是真的和C一起玩过很多东西,真的让我烦恼。
所以锻炼1-6书中要你证明由getchar()
读取字符是,要么1
或0
现在我完全理解,读入缓冲区,检查字符,看它是否是不EOF
,如果这样返回1
其他0
这意味着,如果我输入a
,然后按回车它读取a
和进入和返回1,1
另外,如果我用CTRL+D
返回0
,因为它会导致EOF
。我有的问题和我不明白的逻辑是:当我输入aa Ctrl+D
, 我读它的方式它应该打印1,1,0
,因为它读取a,a
然后EOF
,但它似乎打印1,1
然后等待下一个输入。
这是为什么?
这是我写到目前为止的代码。
#include <stdio.h>
main()
{
int c;
while(c = (getchar() != EOF)) // Read char in buffer and check to see if it's EOF or not, then assign a 1 or 0 to c
{
printf("1 Not End Of File\n");
}
printf("0 End Of File\n");
}
很显然,我可以用printf("%d",c);
显示,如果它是一个1
或0
,但问题仍然有效..
为什么当我做aa ctrl+D
它不能打印
1 Not End Of File
1 Not End Of File
0 End Of File?
而且我我完全意识到这个问题已经在网站上得到了回答,但是似乎没有人详细回答过这个问题,他们似乎是这样说getchar()
如何得到一个字符广告以及它在EOF
时如何退出,但不是为什么如果EOF
被添加到几个字符,下一行不会运行。
这似乎读两个a
的,然后,而不是设置c
到0
时,它应达到CTRL+D
然后退出,同时,它似乎坐等更多的投入?
您可能会看到有关终端输入的一些问题,根本与您的C代码无关。 (1)“a RETURN CTRL + D”,(2)“a CTRL + D”,(3)“a CTRL + D CTRL + D”。 –
你看这就是我的想法。我已经测试了所有三个实验,1)返回1,1,1然后等待输入,然后ctrl + d然后输出0 ... 2)返回1,1然后等待输入。3)返回1,1等待输入然后0 –
这是预期的结果,并且与Shiping的答案一致。 Unix/Linux终端驱动程序会积累字符,并且不会将它们传送到您的程序,直到(a)您按下Return或(b)您按下Control-D。另外,如果它在一行的开始处(即,如果它前面是一个换行符),则控制-D生成EOF。 –