“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发送之前有机会编辑你的输入。
那么基本上是这样的:
-
你调用
getchar()
。 没有可用的输入,所以它等待。 -
你按一下 。 它不是一行的结尾,所以没有输入发送到你的程序,
getchar()
没有任何东西可读,所以它仍然等待。 -
你按b 。 它不是一行的结尾,所以没有输入发送到你的程序,
getchar()
没有任何东西可读,所以它仍然等待。 -
你按c 。 它不是一行的结尾,所以没有输入发送到你的程序,
getchar()
没有任何东西可读,所以它仍然等待。 -
你按d 。 它不是一行的结尾,所以没有输入发送到你的程序,
getchar()
没有任何东西可读,所以它仍然等待。 -
你按e 。 它不是一行的结尾,所以没有输入发送到你的程序,
getchar()
没有任何东西可读,所以它仍然等待。 -
按Enter键 。 现在它是一行的结尾,因此输入
"abcde\n"
被发送到您的程序。 -
getchar()
现在有读取的输入,所以它返回'a'
,递增nc
,然后循环返回等待输入。 -
立即,
getchar()
有更多的输入来读取该行中其余字符的内容,因此它返回'b'
,递增nc
,然后循环返回以等待输入。 -
立即,
getchar()
有更多的输入来从该行的其余字符读取,因此它返回'c'
,递增nc
,并循环返回以等待输入。 -
立即,
getchar()
有更多的输入来读取该行中其余字符的内容,因此它返回'd'
,递增nc
,然后循环返回以等待输入。 -
立即,
getchar()
有更多的输入来读取该行中其余字符的内容,因此它返回'e'
,递增nc
,然后循环返回以等待输入。 -
立即,
getchar()
有更多的输入来读取该行中其余字符的内容,因此返回'\n'
,递增nc
,然后循环返回以等待输入。 -
如果您指定输入结束,可能是按Control – D ,那么
getchar()
没有任何东西可读,并且知道永远不会有任何东西要读,所以它返回EOF
并且你的循环结束。 如果它不是输入结束,则getchar()
将再次等待您输入新的输入行。
所以这里真正发生的是getchar()
在你点击Enter之前什么也没做。 然后,可能在您将手指从Enter键上移开之前,它运行了六次并消耗了您输入的六个输入字符。 但是尽管getchar()
运行了六次,但只提示输入一次(两次,如果你必须键入Control – D ),因为getchar()
只会在没有输入的情况下等待输入等待。
回到独立终端常见的日子,实际的终端设备甚至可能不会在线路末端向计算机传输任何字符,并且可能有少量的板载内存以允许这种本地线路 – 基于编辑,因此计算机本身可能永远不会看到它直到行尾。 在许多人使用的现代PC上,操作系统,在终端驱动程序级别,更可能是缓冲这些字符本身,只是呈现它们并使它们一次一行地提供给你的程序(除非你具体告诉它你当然要立刻想要角色)。
当您键入abcde\n
(从Enter生成的\n
)时,它将被刷新到标准输入流( stdin
)中。
getchar()
,正如其名称本身所暗示的,只考虑1个字符
恩,那就对了。 但请注意, getchar
用于循环 ,循环直到getchar
返回EOF
。 另外,请记住getchar
从stdin
读取输入。
因此,在第一次迭代中,在输入数据后, 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++; }