为什么在使用 getchar 输入时 putchar 不返回新行?
Why is putchar not returning a new line when entered with getchar?
在 Linux 上使用 Clang/GCC 和 运行 进行编译:
当运行以下代码时,我遇到了对我来说意想不到的行为:输入单个字符时("X")我将被提示输入另一个字符("Y")大概是因为缓冲区未满。当我输入第二个字符 ("Y") 时,putchar 只显示第二个字符 ("Y" - 它既不是 returns 第一个 "X" 也没有任何新的 lines/line休息)。我认为这是因为 putchar 正在从头到尾读取流并将缓冲区读取为“[NEW LINE] Y [NEW LINE]”并且原始 "X" 已经超出了为三个变量。但是这种从流的结尾到开头的读取似乎与 putchar 的通常行为不一致 - 如果我输入四个字符 "XYZA" 并按回车键,它 returns 从头到尾的流,可以理解的截断:"XYZ".
我的第一个问题是我上面的假设是否正确,我的第二个问题是:如果是这样,为什么 putchar 不输出可能在缓冲区中的新行。如果我得到“[NEW LINE] Y [NEW LINE]”作为输出,我会很清楚发生了什么,但我只得到 "Y"。这是为什么? putchar trim 是白色 space 元素,还是 getchar 以某种不会转换为转义序列字符的方式读取新行?
我已经尝试了多种使用 enter 键的组合,但没有看到它是如何工作的。我想知道它在做什么。
int main() {
int a,b,c;
printf("Type three letters: ");
a = getchar();
putchar(a);
b = getchar();
putchar(b);
c = getchar();
putchar(c);
}
当运行以上:
如果我输入三个字符它returns三个字符。
如果我键入两个字符(例如 "XY"),它会 returns 两个字符,大概是因为第三个字符是按回车键生成的新行。这确实在显示 "XY" 之后显示了一个新行,这使得以下行为让我更加困惑:
如果我输入一个字符,它会提示我输入另一个字符,当我输入另一个字符时,它只会 returns 第二个字符。为什么是这样?在我看来,它正在从头到尾读取缓冲区 trimming white-space,但这似乎不太可能。我不明白这种行为。
即使我从最后一个例子中只得到一个字符,这对我来说似乎是因为 putchar 从流的末尾读取到流的开头,当键入四个字符时它读取它应该从头到尾:如果我输入四个字符,它 returns 缓冲区中的前三个字符。
stdin
通常是行缓冲的。在输入 '\n'
之前,不会向第一个 getchar()
提供任何内容。
另外'\n'
是输入的字符之一。
在 Linux 上使用 Clang/GCC 和 运行 进行编译:
当运行以下代码时,我遇到了对我来说意想不到的行为:输入单个字符时("X")我将被提示输入另一个字符("Y")大概是因为缓冲区未满。当我输入第二个字符 ("Y") 时,putchar 只显示第二个字符 ("Y" - 它既不是 returns 第一个 "X" 也没有任何新的 lines/line休息)。我认为这是因为 putchar 正在从头到尾读取流并将缓冲区读取为“[NEW LINE] Y [NEW LINE]”并且原始 "X" 已经超出了为三个变量。但是这种从流的结尾到开头的读取似乎与 putchar 的通常行为不一致 - 如果我输入四个字符 "XYZA" 并按回车键,它 returns 从头到尾的流,可以理解的截断:"XYZ".
我的第一个问题是我上面的假设是否正确,我的第二个问题是:如果是这样,为什么 putchar 不输出可能在缓冲区中的新行。如果我得到“[NEW LINE] Y [NEW LINE]”作为输出,我会很清楚发生了什么,但我只得到 "Y"。这是为什么? putchar trim 是白色 space 元素,还是 getchar 以某种不会转换为转义序列字符的方式读取新行?
我已经尝试了多种使用 enter 键的组合,但没有看到它是如何工作的。我想知道它在做什么。
int main() {
int a,b,c;
printf("Type three letters: ");
a = getchar();
putchar(a);
b = getchar();
putchar(b);
c = getchar();
putchar(c);
}
当运行以上:
如果我输入三个字符它returns三个字符。
如果我键入两个字符(例如 "XY"),它会 returns 两个字符,大概是因为第三个字符是按回车键生成的新行。这确实在显示 "XY" 之后显示了一个新行,这使得以下行为让我更加困惑:
如果我输入一个字符,它会提示我输入另一个字符,当我输入另一个字符时,它只会 returns 第二个字符。为什么是这样?在我看来,它正在从头到尾读取缓冲区 trimming white-space,但这似乎不太可能。我不明白这种行为。
即使我从最后一个例子中只得到一个字符,这对我来说似乎是因为 putchar 从流的末尾读取到流的开头,当键入四个字符时它读取它应该从头到尾:如果我输入四个字符,它 returns 缓冲区中的前三个字符。
stdin
通常是行缓冲的。在输入 '\n'
之前,不会向第一个 getchar()
提供任何内容。
另外'\n'
是输入的字符之一。