52

我对 K&R 中提到的使用getchar(). 它提供与输入字符串相同的输出:

#include <stdio.h>

main(){
    int c;
    c = getchar();
    while(c != EOF){
         putchar(c);
         c = getchar();
    }
}

为什么它打印整个字符串?我希望它能够读取一个字符并再次询问输入。

而且,我们输入的所有字符串都以 EOF 结尾吗?

4

5 回答 5

42

在您可能使用的简单设置中,getchar使用缓冲输入,因此您必须在 getchar 读取任何内容之前按 enter。字符串不以EOF;结尾 实际上,EOF它并不是一个真正的字符,而是一个指示文件结束的魔术值。但EOF不是读取的字符串的一部分。getchar当没有什么可读的时候,它就会返回。

于 2010-09-09T13:13:58.887 回答
32

有一个底层缓冲区/流,getchar()朋友们可以从中读取。当您输入文本时,文本会存储在某处的缓冲区中。getchar()一次可以流过一个字符。每次读取都返回下一个字符,直到它到达缓冲区的末尾。它不要求您输入后续字符的原因是它可以从缓冲区中获取下一个字符。

如果您运行脚本并直接输入,它将继续提示您输入,直到您按CTRL+ D(文件结尾)。如果您将其称为./program < myInputwhere myInputis a text file with some data ,它将EOF在到达输入末尾时获得。EOF不是流中存在的字符,而是指示何时到达输入末尾的标记值。

作为一个额外的警告,我相信如果遇到错误getchar()也会返回EOF,所以你需要检查ferror(). 下面的示例(未经测试,但您明白了)。

main() {
    int c;
    do {
        c = getchar();
        if (c == EOF && ferror()) {
            perror("getchar");
        }
        else {
            putchar(c);
        }
    }
    while(c != EOF);
}
于 2010-09-09T13:18:27.670 回答
11

C根据定义,字符串以 . 结尾'\0'。你的程序中没有"C strings"

您的程序从标准输入(键盘)读取字符(缓冲到 ENTER)并将它们写回标准输出(屏幕)。无论您键入多少字符或执行此操作多长时间,它都会执行此操作。

要停止程序,您必须指出标准输入没有更多数据(嗯??键盘怎么可能没有更多数据?)

您只需按Ctrl+ D(Unix) 或Ctrl+ Z(Windows) 即可假装文件已结束。
Ctrl+ D(或Ctrl+ Z)并不是真正C意义上的字符。

如果您使用输入重定向运行程序,则EOF它是文件的实际结尾,而不是 make 信念
./a.out < source.c

于 2010-09-09T13:29:29.147 回答
3

getchar()读取输入的单个字符并将该字符作为函数的值返回。如果读取字符出错,或者到达输入结尾,则getchar()返回一个特殊值,由 表示EOF

于 2010-09-09T13:14:38.083 回答
2

根据 的定义getchar(),它从标准输入中读取一个字符。不幸stdin的是,它被误认为是键盘,而getchar. getchar使用缓冲区,stdin一次读取一个字符。在您的情况下,由于没有EOFgetcharandputchar正在运行多次,并且它看起来像整个字符串一次打印出来。做一个小改动,你就会明白:

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.

于 2015-01-14T07:32:27.993 回答