C - printf()在scanf()之后以行缓冲模式将不带换行符的字符串打印到标准输出



我知道大多数终端默认是行缓冲模式。也就是说,在遇到新行字符之前,输出将被缓冲,而不会定向到标准输出。

所以我希望这个不打印任何东西(至少在缓冲区被填满之前):

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,它在您的程序被允许等待输入之前有出现。这是因为stdoutstdin连接到终端,因此是(注意:这是实现定义的!)标准所称的"交互设备"。

最新更新