我知道大多数终端默认处于行缓冲模式。即输出被缓冲,并且在遇到换行符之前不会被引导到stdout。
所以我希望这不打印任何东西(至少在填充缓冲区之前):
int main() {
while(1) {
printf("Haha");
sleep(1);
}
return 0;
}
它确实在很短的时间内没有打印出来。
如果我想每秒打印“哈哈”,我可以在printf之后printf("Haha\n")
或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语句,它不在这里。为什么会这样?
感谢。
答案 0 :(得分:3)
现在程序打印
Haha. Input sth here:
(并等待我的输入)。如果我删除scanf语句,它不在这里。为什么会这样?
因为标准(N1570 ..“几乎是C11”)这样说,§5.1.2.3/ 6(强调我的):
符合实施的最低要求是:
[..]
- 交互设备的输入和输出动态应按照7.21.3的规定进行。这些要求的目的是尽快显示无缓冲或行缓冲输出,以确保在程序等待输入之前实际显示提示消息。
[..]
即使您的输出不包含换行符并发送到缓冲行stdout
,但在您的程序允许等待输入之前, 。这是因为stdout
和stdin
连接到终端,因此(注意:这是实现定义!)标准称之为“交互式设备”。