【发布时间】:2021-01-24 10:06:16
【问题描述】:
我与 K&R 合作,它广泛使用 getchar() 来输入基础知识。
但问题是我无法完全理解它的行为。
下面是一段代码:
#include <stdio.h>
int main() {
char c,i;
char line[10000];
i = 0;
while((c=getchar()) != EOF && c!= '\n') {
line[i++] = c;
}
printf("%s",line);
}
代码按预期工作。
我的问题是:为什么当我按下回车键时它会终止?当我仍在编写输入并且程序位于c=getchar()时,它如何知道换行符是终止条件?
我知道这不是默认的getchar() 行为,如scanf(),因为当我删除换行条件时,程序不会在换行处终止。 也许我的问题超出了getchar() 并且是一般性问题。
假设我的输入是Hello,然后按回车键。
首先,c 变量变为'H',它被存储在行中,然后是'e',然后是'l',然后是'l',然后是'o',然后它遇到换行符并且循环终止.很好理解。
我想知道为什么它在我按回车后开始读取字符。我希望换行并写更多字符。
【问题讨论】:
-
当您输入换行符时,
c != '\n'为 false,因此整个 while 条件也是如此。至此结束循环。无论如何,此代码都表现出未定义的行为。line未终止,并且作为未初始化的自动变量,不能保证终止符已经到位。因此,将其作为参数传递给%s格式说明符,该格式说明符要求终止字符串,调用 UB,充其量只是一场赌博。 -
但换行条件
c != '\n'中包含 c。当我写Hello时,现在不管c 是什么H。所以,除非你说循环在我写的时候正在运行,否则终止没有意义。 -
所以你问为什么/是否
stdin是 line buffered ? (因为它通常是,仅供参考)。 -
@WhozCraig 我只是想知道为什么
c != '\n'在 c 仍然为空或 H 时调用。或者当我按下回车时输入终止的其他原因 -
“为什么 c 仍然为空时调用 c != '\n'” - 不是。一旦换行符在流中,就会发送缓冲区,在您的情况下,一次消耗一个字符。顺便说一句,根据我的经验,它是终端,而不是实际的运行时,在做你正在经历的缓冲。当通过 IO 重定向提交输入时(因此没有终端插入),终端行缓冲被规避。