首页 > 解决方案 > 为什么使用 getchar 输入时 putchar 不返回新行?

问题描述

使用 Clang/GCC 编译并在 Linux 上运行:

运行以下代码时,我遇到了出乎我意料的行为:输入单个字符(“X”)时,系统会提示我输入另一个字符(“Y”),大概是因为缓冲区未满。当我输入第二个字符(“Y”)时,putchar 只显示第二个字符(“Y” - 它既不返回第一个“X”,也没有任何新的换行符/换行符)。我认为这是因为 putchar 正在从头到尾读取流,并将缓冲区读取为“[NEW LINE] Y [NEW LINE]”,并且原始“X”已经超出了为三个变量分配的缓冲区. 但是这个从流的末尾到开头的读数似乎与 putchar 的通常行为不一致——如果我输入四个字符“XYZA”

我的第一个问题是我的上述假设是否正确,我的第二个问题是:如果是这样,为什么 putchar 不输出可能在缓冲区中的新行。如果我得到“[NEW LINE] Y [NEW LINE]”作为输出,我会很清楚发生了什么,但我只得到“Y”。这是为什么?putchar 是否修剪空白元素,或者 getchar 是否以某种不会转换为转义序列字符的方式读取新行?

我尝试了多种使用回车键的组合,但看不到这是如何工作的。我想知道它在做什么。

int main() {
    int a,b,c;

    printf("Type three letters: ");

    a = getchar();
    putchar(a);
    b = getchar();
    putchar(b);
    c = getchar();
    putchar(c);
}

运行上述内容时:

标签: cgccclanggetcharputchar

解决方案


stdin通常是行缓冲的。getchar()在输入之前,什么都不会给第一个'\n'

也是'\n'输入的字符之一。


推荐阅读