我知道大多数终端默认是行缓冲模式。也就是说,在遇到新行字符之前,输出将被缓冲,而不会定向到标准输出。
所以我希望这个不打印任何东西(至少在缓冲区被填满之前):
int main() {
while(1) {
printf("Haha");
sleep(1);
}
return 0;
}
它确实在短时间内不打印任何内容。
如果我想每秒打印"Haha",我可以在printf之后执行printf("Hahan")
或fflush(stdout)
。(我知道这不是那么便携,但它仍然是一个解决方案)
现在我回想起非常经典的scanf程序(我添加了while(1)循环来防止程序退出时缓冲区刷新):
int main() {
char char_in;
while(1) {
printf("Haha. Input sth here: ");
scanf("%c", &char_in);
}
return 0;
}
现在程序打印Haha. Input sth here:
(等待我的输入)。如果我删除scanf语句,它就不在这里了。为什么会这样呢?
谢谢。
现在程序打印
Haha. Input sth here:
(并等待我的输入)。如果我删除scanf语句,它就不在这里了。为什么会这样呢?
因为标准(N1570 .."几乎C11")这样说,§5.1.2.3/6(强调我的):
一致性实现的最低要求是:
[. .][. .]
- 交互设备的输入和输出动态应按照7.21.3的规定进行。这些要求的目的是使未缓冲或行缓冲的输出尽快出现,以确保提示消息在程序等待输入之前实际出现。
即使您的输出不包含换行符并被发送到行缓冲的stdout
,它在您的程序被允许等待输入之前有出现。这是因为stdout
和stdin
连接到终端,因此是(注意:这是实现定义的!)标准所称的"交互设备"。