关于C语言输入缓冲区的浅显理解
缓冲区的存在使得很多标准输入输出函数不能正确地执行,导致很多刚入门的C语言新手苦恼不已,今天我们就来浅显地分析分析吧。
什么是缓冲区
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
为什么要有缓冲区
假设CPU工作时直接和硬盘进行数据传输,那么会出现什么结果呢?CPU运行速度很快,而硬盘的读取速度相对CPU就显得很慢了,两者速度的不匹配,使得程序的运行效率很低,这显然不是C语言的特点所在。
所以缓冲区的存在就理所当然了,缓冲区在中间充当桥梁的作用,提高程序的运行效率。
缓冲区导致的问题
我们先来看看一个简单的小程序
#include <stdio.h>
int main()//从键盘上获取一个整型数据和一个字符
{
//初始化
int num = 0;
char ch = 'C';
//获取数据
printf("请输入一个数:");
scanf("%d",&num);
scanf("%c",&ch);
//打印数据
printf("%d\n",num);
printf("%c\n",ch)
return 0;
}
程序的结果和预想的并不同,在程序获取到一个int型数据就显示该int型的数据并换行回车了,程序就结束了。
尽管这个程序很简单,但这就可以说明缓冲区的问题了。
产生原因
这就和标准输入函数scanf有关了。
scanf以回车为结束标志时,会把字符’\n’也输入到输入缓冲区,所以下一条执行语句直接把’\n’当做字符读入ch中了。
解决办法
清空缓冲区
- getchar();会清空缓冲区中的一个字符
- scanf("%*[^\n]");
scanf("%*c");
//此种方法必须确保缓冲区中有垃圾数据 - stdin->_IO_read_ptr = stdin->_IO_read_end;
//不同的平台使用方法不同,但不管有没有垃圾数据。