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。