我们知道printf()函数有buff缓冲区,但是这个缓冲区是怎么工作的呢。
其实我们程序有scanf或gets等这种输入函数的时候,有没有发现,当我们输入字符串等数据在窗口的时候,并不会立马输出我们的字符,需要我们继续按下回车或别的与字符串无关的操作才能使字符串打印至屏幕。
这就是因为这些输入函数(scanf,gets等)拥有输入缓冲区。类似printf和puts的输出函数也有输出缓冲区。
例如下面的函数:
int main()
{
printf(“hello”);
sleep(5);
printf(“world\n”);
exit(0);
}
此函数就不会立马打印hello,而是等待5秒后出现helloworld,这就是输出缓冲区在作用。
当printf读进字符串的时候,并不会马上打印,而是先储存在buff里面,当遇到下面4种条件的时候才进行打印:
1、程序结束 return 0; 或 exit(0);
2、遇到”\n”
3、主动刷新 fflush(stdout);
4、缓冲区满
所以,hello只是被存储在了缓冲区里,没有遇到上面条件的一种,这就是为什么会先等待,后出现helloworld。
当在第一个printf里加入”\n”,之后就会先打印hello,之后等待5秒,换行继续打印world
ps:为什么要引入缓冲区,是因为进行用户态和内核态的切换过于麻烦,引入缓冲区可以使系统更加有效率的运行,具体内容可以参考系统调用与文件操作。