什么是缓冲区?
在C语言中,缓冲区(Buffer)是一种用于临时存储数据的内存区域。它通常用于在数据的产生和消耗之间进行中间存储和传输。它是在堆上开辟的一块空间。
作用
减少系统调用的次数,提高效率
例如:当从键盘或其他输入设备读取数据时,数据通常会首先被存储在输入缓冲区中,然后程序可以从缓冲区中逐个字符或一次一行地读取数据,这样就无需读一个字符调进行一次系统调用。
输出缓冲区种类
- 行缓冲
程序当读取字符遇到 '\n' 时,将会刷新缓冲区,将读取的内容输出。
当程序结束时,将会刷新缓冲区,将读取的内容输出。
同样,我们可以代码手动的进行刷新缓冲区 fflush(stdout) ,来达到我们需要的效果
需要注意的是,缓冲区也存在大小,当缓冲区被塞满后,缓冲区将自动刷新,将其中的内容输出 - 全缓冲
这种类型输出缓冲区只有当缓冲区被塞满后才会将其中的内容输出
输入缓冲区
从终端读取数据,读到换行符'\n' 为止,空格和回车,将会一起被缓冲区丢弃,直到遇到下一个非空字符为止
缓冲区带来的问题
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
在以上示例中,我们将去等待终端的输入字符,而当我们输入第一个字符,并且按下回车后,变量a将会被赋值为所输入字符,但此时会发现,跳过了b的赋值阶段,b会被赋值为 '\n' ,这是因为scanf通过回车来将判断输入是否结束,scanf会将回车之前的内容读取,并且将 '\n' 留在了缓冲区中,而在下一次scanf读取时遇到了'\n' 将该字符赋值给了变量b。
要避免此情况需要在赋值变量a后,将缓冲区清空。
清空缓冲区
getchar函数,会从缓冲区中读取一个字符,因此常用其来清空缓冲区
//清空缓冲区
char temp;
while((temp = getchar())!='\n' || temp != EOF);