getchar()如何工作?

我对使用getchar() K&R中提到的程序感到困惑。 它给出与inputstring相同的输出:

 #include <stdio.h> main(){ int c; c = getchar(); while(c != EOF){ putchar(c); c = getchar(); } } 

为什么打印整个string? 我希望它读一个字符,并再次要求input。

而且,我们input的所有string都是由EOF终止的吗?

在可能使用的简单设置中, getchar缓冲input一起工作,所以您必须在getchar获取任何内容之前按Enter键。 string不被EOF终止; 实际上, EOF并不是一个真正的字符,而是一个指示文件结尾的魔法值。 但EOF不是string读取的一部分。 这是getchar在没有剩下要读的时候返回的东西。

有一个底层缓冲区/streamgetchar()和朋友读取。 当你input文本时,文本被存储在某个缓冲区中。 getchar()可以一次stream过一个字符。 每次读取都会返回下一个字符,直到达到缓冲区的末尾。 它不要求你后来的字符的原因是它可以从缓冲区中获取下一个字符。

如果您运行脚本并直接input脚本,它将继续提示您input,直到按下CTRL + D(文件结尾)。 如果你把它叫做./program <myInput,其中myInput是一个带有一些数据的文本文件,当它到达input的末尾时,它将得到EOF。 EOF不是存在于stream中的字符,而是用于指示何时到达input的末尾的标记值。

作为一个额外的警告,我相信如果遇到错误,getchar()也会返回EOF,所以你需要检查ferror()。 下面的例子(没有testing,但你明白了)。

 main() { int c; do { c = getchar(); if (c == EOF && ferror()) { perror("getchar"); } else { putchar(c); } } while(c != EOF); } 

C定义的string以'\0'结尾。 您的程序中没有"C strings"

你的程序从标准input(键盘)读取字符(caching到ENTER),并将它们写回标准输出(屏幕)。 不pipe你input多less个字符或者你做了多长时间,都可以这样做。

要停止程序,你必须指出,标准input没有更多的数据(呵呵??键盘没有更多的数据?)

您只需键入Ctrl+D (Unix)或Ctrl+Z (Windows)即可假定文件已达到其结尾。
Ctrl+D (或Ctrl+Z )在C意义上并不是真正的字符。

如果使用inputredirect来运行程序,则EOF是文件的实际结尾,而不是一个确信的结尾
./a.out < source.c

getchar()读取input的单个字符并将该字符作为函数的值返回。 如果读取字符时出现错误,或者到达input的结尾,则getchar()返回一个特殊值,用“EOF”表示。

根据getchar()的定义,它从标准input中读取一个字符。 不幸的是,stdin被误认为是键盘,可能并不适用于getchar。 getchar使用一个缓冲区作为标准input,并一次读取一个字符。 在你的情况下,因为没有EOF的getchar和putchar运行多次,它看起来像你整个string一次打印出来。 做一个小小的改变,你会明白:

 putchar(c); printf("\n"); c = getchar(); 

现在看看与原始代码相比的输出。

另一个例子,将解释你的getchar和cachingstdin的概念:

 void main(){ int c; printf("Enter character"); c = getchar(); putchar(); c = getchar(); putchar(); } 

在第一种情况下input两个字符。 getchar运行的第二次是你input任何字符? 不,但仍然putchar作品。

这最终意味着有一个缓冲区,当你input一些东西,然后点击input这个缓冲区。 getchar使用这个缓冲区作为stdin。