例1
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("a");
printf("b");
sleep(5);
printf("c");
printf("d");
return 0;
}
这段代码字面上看,是先输出a
、b
,然后等待5秒,再输出c
、d
。
然而实际上:

它在运行时没有直接输出
a
、b
,等5秒,而是直接5秒后一次性输出abcd
。这是因为printf在打印到标准输出时,先写到缓冲区,直到遇到\n
或者\r
才会刷新缓存区,打印到屏幕上。
刷新缓冲区的条件:
- 缓冲区填满;
- 写入的字符中有‘\n’, '\r';
- 调用fflush手动刷新缓冲区;
- 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。
下面例子来进行演示:
例2
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("a");
printf("b");
fflush(stdout);
sleep(5);
printf("c");
printf("d");
return 0;
}

其它情况大家可自己测试。
网友评论