我对K&R中使用getchar()
的程序感到困惑。它提供与输入字符串相同的输出:
#include <stdio.h>
main(){
int c;
c = getchar();
while(c != EOF){
putchar(c);
c = getchar();
}
}
为什么会打印整个字符串?我希望它能读取一个字符,然后再次要求输入。
而且,我们输入的所有字符串都以EOF结尾吗?
在您可能使用的简单设置中,getchar
与buffered输入配合使用,因此必须先按Enter键,然后getchar才能读取任何内容。字符串不以EOF
终止;实际上,EOF
并不是真正的字符,而是指示文件结尾的不可思议的值。但是EOF
不是读取的字符串的一部分。这是getchar
在什么都没读完的情况下返回的内容。
[有一个底层缓冲区/流,getchar()
和朋友可以从中读取。输入文本时,文本将存储在缓冲区中的某个位置。 getchar()
一次可以流过一个字符。每次读取都会返回下一个字符,直到到达缓冲区末尾。它不要求您提供后续字符的原因是它可以从缓冲区中获取下一个字符。
如果您运行脚本并直接键入脚本,它将继续提示您输入,直到您按CTRL + D(文件末尾)。如果像./program < myInput
那样调用它,其中myInput
是带有某些数据的文本文件,则到达输入末尾时它将得到EOF
。 EOF
不是流中存在的字符,而是一个哨兵值,用于指示何时到达输入的末尾。
[作为额外的警告,我相信getchar()
如果遇到错误也会返回EOF
,因此您需要检查ferror()
。下面的示例(未经测试,但您可以理解)。
main() {
int c;
do {
c = getchar();
if (c == EOF && ferror()) {
perror("getchar");
}
else {
putchar(c);
}
}
while(c != EOF);
}
C
定义的字符串以'\0'
终止。您的程序中没有"C strings"
。
您的程序从标准输入(键盘)读取字符(缓冲到ENTER),并将它们写回到标准输出(屏幕)。无论您键入多少字符或执行多长时间,它都会执行此操作。
要停止该程序,您必须指示标准输入没有更多数据([huh?如何键盘没有更多数据?]。
您只需按Ctrl + D(Unix)或Ctrl + Z(Windows)即可假装文件已到达末尾。在单词的C
含义上,Ctrl + D(或Ctrl + Z)不是真正的字符。
如果使用输入重定向来运行程序,则EOF
是文件的实际结尾,而不是使人信服的一个]./a.out < source.c
getchar()
读取输入的单个字符,并将该字符作为函数的值返回。如果读取字符时出错,或者到达输入结尾,则getchar()
返回一个特殊值,由EOF
表示。
根据getchar()
的定义,它从标准输入中读取一个字符。不幸的是,stdin
误认为是键盘,而getchar
可能并非如此。 getchar
使用缓冲区作为stdin
,一次读取一个字符。在您的情况下,由于没有EOF
,因此getchar
和putchar
会运行多次,因此您会一次看到整个字符串,因此看上去很像。进行一些小的更改,您将了解:]>
putchar(c); printf("\n"); c = getchar();
现在将输出与原始代码进行比较。
另一个示例将为您解释getchar
和缓冲的stdin
的概念:
void main(){ int c; printf("Enter character"); c = getchar(); putchar(); c = getchar(); putchar(); }
在第一种情况下输入两个字符。第二次
getchar
运行时,您输入任何字符吗?否,但putchar
仍然有效。
这最终意味着有一个缓冲区,只要您键入内容并单击Enter,它就会进入缓冲区。 getchar
将此缓冲区用作stdin
。