getchar()如何工作?

Shu*_*ham 44 c

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

#include <stdio.h>

main(){
    int c;
    c = getchar();
    while(c != EOF){
         putchar(c);
         c = getchar();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

并且,我们输入的所有字符串是否由EOF终止?

Eri*_*ler 40

在您可能正在使用的简单设置中,getchar使用缓冲输入,因此您必须在getchar获取任何内容之前按Enter键.字符串不会被终止EOF; 实际上,EOF它实际上不是一个字符,而是一个表示文件结尾的魔术值.但EOF不是字符串读取的一部分.getchar当没有什么东西可以阅读时,它会返回.

  • 当我在 K&amp;R 中尝试 count char 程序时,我发现 `get char()` 像“abc”一样获取我的输入,当计数时,它会是 `4` 而不是 `3`,所以我使用 `gdb` 来调试原来,附加的一个'字符'是(nl),其ASCII码是0x0a。那么,我的输入是字符串吗?那个字符串不是以'\0'结尾吗?为什么有(nl)? (2认同)

Tim*_*thy 31

有一个底层缓冲区/流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);
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供CTRL + D信息. (2认同)

pmg*_*pmg 10

根据C定义,字符串由终止'\0'.你"C strings"的课程没有.

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

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

您只需键入Ctrl+D(Unix)或Ctrl+Z(Windows)以假装文件已到达其结尾.
Ctrl+D(或Ctrl+Z)不是真正C意义上的字符.

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