1

这是一些C代码:

int i;
printf("This text is printed\nThis text is not until the for loop end.");
for (i = 5; i > 0; i--)
{
    printf("%d", i);
    sleep(1);
}

为什么循环开始'\n'之前没有打印出之后的其余文本?for甚至 for 循环内的 printf 也仅在循环结束后打印。如果我'\n'在文本末尾放了 a ,它会打印出来,但我不想换行。

这只发生在 Linux 上而不是 Windows 上(只是将 sleep(1) 更改为 Sleep(1000) 并添加了 windows.h)。

4

3 回答 3

3

这是由输出缓冲引起的。当您调用 printf 时,不会立即打印输出。它被写入缓冲区以在将来的某个时间输出。通常一个\n字符会导致缓冲区自动刷新。您还可以手动刷新标准输出缓冲区:

printf("This text is printed\nThis text is not until the for loop end.");
fflush(stdout);
于 2013-08-27T00:43:59.510 回答
2

stdoutC 标准未指定缓冲区。但是 POSIX 暗示(不需要)stdout当它连接到终端时通常是行缓冲的,否则是完全缓冲的。

Linux 遵循这个 POSIX 约定,但 Windows 没有。setvbuf您可以使用或用于fflush刷新输出来更改默认行为,这是由 C 标准保证的。

于 2013-08-27T01:03:59.977 回答
1

查找setvbuf()_IONBFvs _IOLBFvs _IOFBF。默认情况下,当输出到终端时,输出是行缓冲的 ( _IOLBF)。这意味着只有在包含换行符时才会出现输出。 _IONBF是非缓冲的,有时是为标准错误保留的(尽管它也可以是行缓冲的)。 _IOFBF完全缓冲;fflush()直到内部缓冲区已满,或者您明确输出(或者,有时,如果您从标准输入读取),输出才会出现。如果您写入管道或文件,则输出通常会被完全缓冲。

通常,如果您想及时查看输出,则应该期望以换行符结束输出——尽管基于 Windows 的示例恰恰相反。(它是 Stack Overflow 上的一个常见模因,可以合理可靠地识别何时为 Windows 编写程序。)

于 2013-08-27T00:53:03.160 回答