printf()在scanf()之后以行缓冲模式将不带换行符的字符串打印到stdout

时间:2016-09-15 04:34:17

标签: c stdio

我知道大多数终端默认处于行缓冲模式。即输出被缓冲,并且在遇到换行符之前不会被引导到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语句,它不在这里。为什么会这样?

感谢。

1 个答案:

答案 0 :(得分:3)

  

现在程序打印Haha. Input sth here:(并等待我的输入)。如果我删除scanf语句,它不在这里。为什么会这样?

因为标准(N1570 ..“几乎是C11”)这样说,§5.1.2.3/ 6(强调我的):

  

符合实施的最低要求是:

     

[..]

     
      
  • 交互设备的输入和输出动态应按照7.21.3的规定进行。这些要求的目的是尽快显示无缓冲或行缓冲输出,以确保在程序等待输入之前实际显示提示消息
  •   
     

[..]

即使您的输出不包含换行符并发送到缓冲行stdout,但在您的程序允许等待输入之前, 。这是因为stdoutstdin连接到终端,因此(注意:这是实现定义!)标准称之为“交互式设备”。