“getchar()”函数如何能够将多个字符作为输入?

这是C中的基本字符计数程序:

#include  #include  int main(){ long nc = 0; while(getchar() != EOF) nc++; printf("%ld\n" , nc); } 

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

默认情况下,标准输入是使用交互式设备进行行缓冲的。 这意味着在完成一行准备之前,您的程序根本不会看到任何输入,在您按Enter键的情况下。 一个很好的理由是,如果用户键入她的8个字符的密码,然后按退格8次,然后键入她的用户名并点击Enter ,那么你的程序只获取她的用户名,并且永远不会看到更正,这通常是你的想要在你的shell发送之前有机会编辑你的输入。

那么基本上是这样的:

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

  2. 你按一下 。 它不是一行的结尾,所以没有输入发送到你的程序, getchar()没有任何东西可读,所以它仍然等待。

  3. 你按b 。 它不是一行的结尾,所以没有输入发送到你的程序, getchar()没有任何东西可读,所以它仍然等待。

  4. 你按c 。 它不是一行的结尾,所以没有输入发送到你的程序, getchar()没有任何东西可读,所以它仍然等待。

  5. 你按d 。 它不是一行的结尾,所以没有输入发送到你的程序, getchar()没有任何东西可读,所以它仍然等待。

  6. 你按e 。 它不是一行的结尾,所以没有输入发送到你的程序, getchar()没有任何东西可读,所以它仍然等待。

  7. Enter键 。 现在它一行的结尾,因此输入"abcde\n"被发送到您的程序。

  8. getchar()现在有读取的输入,所以它返回'a' ,递增nc ,然后循环返回等待输入。

  9. 立即, getchar()有更多的输入来读取该行中其余字符的内容,因此它返回'b' ,递增nc ,然后循环返回以等待输入。

  10. 立即, getchar()有更多的输入来从该行的其余字符读取,因此它返回'c' ,递增nc ,并循环返回以等待输入。

  11. 立即, getchar()有更多的输入来读取该行中其余字符的内容,因此它返回'd' ,递增nc ,然后循环返回以等待输入。

  12. 立即, getchar()有更多的输入来读取该行中其余字符的内容,因此它返回'e' ,递增nc ,然后循环返回以等待输入。

  13. 立即, getchar()有更多的输入来读取该行中其余字符的内容,因此返回'\n' ,递增nc ,然后循环返回以等待输入。

  14. 如果您指定输入结束,可能是按ControlD ,那么getchar()没有任何东西可读,并且知道永远不会有任何东西要读,所以它返回EOF并且你的循环结束。 如果它不是输入结束,则getchar()将再次等待您输入新的输入行。

所以这里真正发生的是getchar()在你点击Enter之前什么也没做。 然后,可能在您将手指从Enter键上移开之前,它运行了六次并消耗了您输入的六个输入字符。 但是尽管getchar()运行了六次,但只提示输入一次(两次,如果你必须键入ControlD ),因为getchar()只会在没有输入的情况下等待输入等待。

回到独立终端常见的日子,实际的终端设备甚至可能不会在线路末端向计算机传输任何字符,并且可能有少量的板载内存以允许这种本地线路 – 基于编辑,因此计算机本身可能永远不会看到它直到行尾。 在许多人使用的现代PC上,操作系统,在终端驱动程序级别,更可能是缓冲这些字符本身,只是呈现它们并使它们一次一行地提供给你的程序(除非你具体告诉它你当然要立刻想要角色)。

当您键入abcde\n (从Enter生成的\n )时,它将被刷新到标准输入流( stdin )中。

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

恩,那就对了。 但请注意, getchar用于循环 ,循环直到getchar返回EOF 。 另外,请记住getcharstdin读取输入。

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

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

getchar从标准输入缓冲区中读取下一个字符,并返回它,因为你将六个字符 – “abcde \ n” – 输入到标准输入中,并且你在while循环中调用getchar ,这意味着循环体运行了六次,它逐个读取字符。 你可以通过以下方式测试:

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