默认情况下,标准输入通过交互式设备进行行缓冲。这意味着你的程序将看不到任何输入,直到一条完整的线路就绪,在你的情况下,当你点击输入。其中一个很好的理由是,如果用户键入她的8位字符密码,然后点击退格键8次,然后键入她的用户名并点击输入,那么您的程序只会获得她的用户名,并且从不会看到更正,通常当你的shell在任何地方发送之前都有机会编辑你的输入时你想要什么。
所以会发生什么本质上是这样的:
你叫getchar()
。没有输入可用,所以它等待。
您按a。这不是一行的结尾,所以没有输入发送到您的程序,getchar()
没有什么可读的,所以它仍然等待。
您按b。这不是一行的结尾,所以没有输入发送到您的程序,getchar()
没有什么可读的,所以它仍然等待。您可以按c。这不是一行的结尾,所以没有输入发送到您的程序,getchar()
没有什么可读的,所以它仍然等待。
您按d。这不是一行的结尾,所以没有输入发送到您的程序,getchar()
没有什么可读的,所以它仍然等待。
您按e。这不是一行的结尾,所以没有输入发送到您的程序,getchar()
没有什么可读的,所以它仍然等待。
您按输入。现在它是一行的结尾,所以输入"abcde\n"
是发送到你的程序。
getchar()
现在有输入要读取,所以它返回'a'
,增量nc
,并循环回来等待输入。
,立即getchar()
有更多的投入从该行的其余字符阅读,因此它返回'b'
,增加nc
,并返回到等待输入。
,立即getchar()
有更多的投入从该行的其余字符阅读,因此它返回'c'
,增加nc
,并返回到等待输入。
,立即getchar()
有更多的投入从该行的其余字符阅读,因此它返回'd'
,增加nc
,并返回到等待输入。
,立即getchar()
有更多的投入从该行的其余字符阅读,因此它返回'e'
,增加nc
,并返回到等待输入。
立即,getchar()
有更多的输入来读取该行中其余字符,因此它返回'\n'
,增量nc
,并循环回来等待输入。
如果您标志着最终的投入,或许按控制 - d,然后getchar()
无关阅读并知道永远不会有任何读,所以它返回EOF
和你的循环结束。如果它是而不是输入结束,那么getchar()
将再次在此等待,以输入新的输入行。
那么,这里实际发生的是,getchar()
什么也没做,直到你打输入。然后,可能在您将手指从输入键之前,它会运行六次并使用您输入的六个字符的输入。但是,尽管getchar()
运行6次,你只提示输入一次东西(两次,如果包括不必键入控制 - d),因为getchar()
仅会等待你输入时,它已经没有输入可用并等待。
回到独立终端常见的时代,实际的终端设备甚至可能不会将任何字符传输到计算机,直到行结束,并且可能有少量的板载内存允许这种类型本地的基于行的编辑,所以计算机本身可能从字面上看不到直到行尾。在许多人使用的现代PC中,操作系统在终端驱动程序层面更有可能缓冲这些字符本身,并且只显示它们并使它们一次对应一行(除非您专门告诉它,你当然需要角色)。
每次通过循环只读取一个字符。 nd统计这些通行证的数量。我不明白你为什么会认为它很神秘。 –
删除循环,然后再看! – Olaf