2016-05-08 44 views
2

下面是一个基本字符用C进行计数的程序:“getchar()”函数如何将多个字符作为输入?

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    long nc = 0; 

    while(getchar() != EOF) 
     nc++; 
    printf("%ld\n" , nc); 
} 

当我输入“ABCDE”作为输入时,它显示的6的值,1为换行字符(触发EOF试验后) 。但我的疑问是,getchar(),正如它的名字所暗示的那样,只考虑了1个字符。但是当我一口气进入“abcde”时,它仍然有效。这是为什么?我在这里做什么问题?

+3

每次通过循环只读取一个字符。 nd统计这些通行证的数量。我不明白你为什么会认为它很神秘。 –

+0

删除循环,然后再看! – Olaf

回答

0

getchar从标准输入的缓冲区中读取下一个字符并返回它,因为您将六个字符 - “abcde \ n”输入到标准输入中,并且您在while循环中调用getchar,这意味着循环体是跑了六次,它逐个阅读字符。您可以测试这种情形:当你在abcde\n(从产生输入\n)型

int c; 
while ((c = getchar()) != EOF) { 
    printf("got %c\n", c); 
    nc++; 
} 
3

,它被冲入标准输入流(stdin)。

getchar(),正如它的名字本身所暗示的,只需要1个字符考虑

是的,这是正确的。但请注意,getchar用于回路,回路直到getchar返回EOF。另外,回想一下,getcharstdin读取输入。

因此,在第一次迭代中,在键入数据后,getchar会读取第一个字符a。在第二次迭代中,它不会等待输入,因为stdin仍然包含bcde\n,因此读取下一个字符b等等。

最后,当您触发EOF时,循环会中断。然后,printf得到执行(打印6,因为六个字符被读取)并且程序结束。

+0

好的,但每次调用'getchar'时,都必须输入一些内容。那么为什么会发生这种情况,如果'stdin'中仍有'bcde \ n' – codetalker

+1

'getchar'等待输入_if_ stdin是空的。否则,它不会消耗下一个字符。 –

11

默认情况下,标准输入通过交互式设备进行行缓冲。这意味着你的程序将看不到任何输入,直到一条完整的线路就绪,在你的情况下,当你点击输入。其中一个很好的理由是,如果用户键入她的8位字符密码,然后点击退格键8次,然后键入她的用户名并点击输入,那么您的程序只会获得她的用户名,并且从不会看到更正,通常当你的shell在任何地方发送之前都有机会编辑你的输入时你想要什么。

所以会发生什么本质上是这样的:

  1. 你叫getchar()。没有输入可用,所以它等待。

  2. 您按a。这不是一行的结尾,所以没有输入发送到您的程序,getchar()没有什么可读的,所以它仍然等待。

  3. 您按b。这不是一行的结尾,所以没有输入发送到您的程序,getchar()没有什么可读的,所以它仍然等待。您可以按c。这不是一行的结尾,所以没有输入发送到您的程序,getchar()没有什么可读的,所以它仍然等待。

  4. 您按d。这不是一行的结尾,所以没有输入发送到您的程序,getchar()没有什么可读的,所以它仍然等待。

  5. 您按e。这不是一行的结尾,所以没有输入发送到您的程序,getchar()没有什么可读的,所以它仍然等待。

  6. 您按输入。现在它一行的结尾,所以输入"abcde\n"是发送到你的程序。

  7. getchar()现在有输入要读取,所以它返回'a',增量nc,并循环回来等待输入。

  8. ,立即getchar()有更多的投入从该行的其余字符阅读,因此它返回'b',增加nc,并返回到等待输入。

  9. ,立即getchar()有更多的投入从该行的其余字符阅读,因此它返回'c',增加nc,并返回到等待输入。

  10. ,立即getchar()有更多的投入从该行的其余字符阅读,因此它返回'd',增加nc,并返回到等待输入。

  11. ,立即getchar()有更多的投入从该行的其余字符阅读,因此它返回'e',增加nc,并返回到等待输入。

  12. 立即,getchar()有更多的输入来读取该行中其余字符,因此它返回'\n',增量nc,并循环回来等待输入。

  13. 如果您标志着最终的投入,或许按控制 - d,然后getchar()无关阅读并知道永远不会有任何读,所以它返回EOF和你的循环结束。如果它是而不是输入结束,那么getchar()将再次在此等待,以输入新的输入行。

那么,这里实际发生的是,getchar()什么也没做,直到你打输入。然后,可能在您将手指从输入键之前,它会运行六次并使用您输入的六个字符的输入。但是,尽管getchar()运行6次,只提示输入一次东西(两次,如果包括不必键入控制 - d),因为getchar()仅会等待你输入时,它已经没有输入可用并等待。

回到独立终端常见的时代,实际的终端设备甚至可能不会将任何字符传输到计算机,直到行结束,并且可能有少量的板载内存允许这种类型本地的基于行的编辑,所以计算机本身可能从字面上看不到直到行尾。在许多人使用的现代PC中,操作系统在终端驱动程序层面更有可能缓冲这些字符本身,并且只显示它们并使它们一次对应一行(除非您专门告诉它,你当然需要角色)。

相关问题