找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

C/C++ | C语言之缓存区

admin 2019-9-11 20:03 106人围观 C++相关


C语言之缓存区


C语言中我们常常要去清空缓存区,若缓存区在栈内分配则不需要手动清除,因为系统会帮你完成这个工作,但如果缓存区分配在堆内的话,就要自己手动清除了,不然会发生内存泄漏,产生的问题就是占用的资源不可以及时释放,从而影响系统性能,首先我们介绍一下缓存区。


1.缓存区


缓存区它是内存空间的一部分,它在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区又分为三种类型,一是全缓冲、二是行缓冲、三是不带缓冲。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。缓存区的意义是在告诉CPU与低速的设备之间的一个区域,这个区域让CPU工作效率更高。

1)全缓冲

当填满标准I/O缓存后才进行实际I/O操作,就如对磁盘文件的读写,我们先把数据放在缓存区中,缓冲区的内容读取完后,再次从磁盘中读取信息。

2)行缓冲

当在输入和输出中遇到换行符时,执行真正的I/O操作。这时我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是标准输入和标准输出。

3)不带缓存

也就是不进行缓冲,标准出错情况是典型代表,这使得出错信息可以直接尽快地显示出来。大部分系统默认使用下列类型的缓存,如果是涉及终端设备的流,则它们是行缓存的,否则是全缓存的。

现在我们提出一个问题:为什么要清空缓存区?

这是因为有的时候在输入一个字符后,再输入一个字符,如果你不清空缓存区,那么上一个字符还在你的缓存区内,这样就会造成错误了。


2.清空缓存区


下面介绍一种简单的清空缓存区的方法。

使用while((ch=getchar())!='\n'&&ch!=EOF);语句

这种方法可以称为万能清空缓存区域语句。

代码展示:
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char c1=0;
    char c2=0;

    scanf("%c",&c1);
    c2=getcahr();
    printf("c1=%d,c2=%c",c1,c2); 

    system("pause"); 
    return 0;
}


上述代码未加入万能语句,getchar()函数依然接受了'\n',造成程序停止。结果如下:



当我们插入万能语句时:
#include <stdio.h>
#include <stdlib.h>

int main()

{
    char c1=0;
    char c2=0;

    scanf("%c",&c1);
    while((ch=getchar())!=EOF && ch!='\n'); 
    c2=getcahr();
    printf("c1=%d,c2=%c",c1,c2);

    system("pause"); 
    return 0;
}


加入万能语句后,缓存区得到清空,于是结果如下:




3.总结


缓存区不会一直在输入中输出内容,而是等待一个输出的终止,比如先打印一行再等待其他输出。

常见问题简单粗暴的方法:
scanf()遇到回车或空格结束,并且回车与空格保存在缓存器中setbuf()函数关闭缓存区
getchar()遇到回车与空格结束,并且回车与空格保存在缓存器中setbuf(stdin)关闭输入缓冲区
gets()遇到回车结束,在字符输入完成后加\0,缓存器中\n清除setbuf(stdout)关闭输出缓冲区




作者|何峰-虎峪山下项目负责人

编辑|欧阳一霖

Concise咨询迎新QQ群 | 540772183

入群备注 | 姓名-班级-学号



往期推荐

Android/Java|Java集合类讲解篇

C/C++ | C语言高级进阶篇之内存四区模型

Concise纳新啦!

官方微博@Concise未来校园







一个为学生群体打造的个性化赋能社区。

我们期待你的加入!

长按二维码关注我们,

与优秀的学长学姐一起进步!

----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:肯塞斯未来校园,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......