2017-01-22 22 views
1

与当前代码混淆。 在大学学习,并通过由Brian W. Kernighan的现在尝试打印出所有输入字符的getchar()!= EOF的返回

我一直在编程了好几年,主要在C++和Java的一点目前打算C程序设计语言(第二版),但是不是真的和C一起玩过很多东西,真的让我烦恼。

所以锻炼1-6书中要你证明由getchar()读取字符是,要么10

现在我完全理解,读入缓冲区,检查字符,看它是否是不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);显示,如果它是一个10,但问题仍然有效..

为什么当我做aa ctrl+D它不能打印

1 Not End Of File 
1 Not End Of File 
0 End Of File? 

而且我我完全意识到这个问题已经在网站上得到了回答,但是似乎没有人详细回答过这个问题,他们似乎是这样说getchar()如何得到一个字符广告以及它在EOF时如何退出,但不是为什么如果EOF被添加到几个字符,下一行不会运行。

这似乎读两个a的,然后,而不是设置c0时,它应达到CTRL+D然后退出,同时,它似乎坐等更多的投入?

+2

您可能会看到有关终端输入的一些问题,根本与您的C代码无关。 (1)“a RETURN CTRL + D”,(2)“a CTRL + D”,(3)“a CTRL + D CTRL + D”。 –

+0

你看这就是我的想法。我已经测试了所有三个实验,1)返回1,1,1然后等待输入,然后ctrl + d然后输出0 ... 2)返回1,1然后等待输入。3)返回1,1等待输入然后0 –

+0

这是预期的结果,并且与Shiping的答案一致。 Unix/Linux终端驱动程序会积累字符,并且不会将它们传送到您的程序,直到(a)您按下Return或(b)您按下Control-D。另外,如果它在一行的开始处(即,如果它前面是一个换行符),则控制-D生成EOF。 –

回答

0

我认为Ctl-D只是为了触发程序来读取输入。因为你输入了一些字符,程序有一些东西需要阅读,并且看不到输入的结尾。单独键入Ctl-D,程序会尝试读取输入,但在那里看不到任何内容,并将其视为已达到输入末尾。喜欢补充一点,Ctl-D本身不会传递给getchar()作为输入读取。

相关问题