c语言-利用getchar()清空缓冲区

耐心、专心、细心


前言

本篇文章主要介绍关于c语言中缓冲区的分类并利用getchar()清空缓冲区


一、缓冲区的分类

缓冲区:用于平滑两种不同速度的硬部件或设备之间的数据传输,在内存开辟的一个存储区,专门用于临时存放I/O操作的数据。
从输入输出设备角度,缓冲区分为:输入缓冲区和输出缓冲区;
在这里插入图片描述

图1.1

从缓冲区的类型角度,缓冲区分为:全缓冲区、行缓冲区、不带缓冲区。
在这里插入图片描述

图1.2

二、利用getchar()清空缓冲区

2.1为什么需要清空缓冲区?

在某些场景下,如果不及时清空缓冲区,进行下次输入时,会导致有些输入函数直接从缓冲区读取数据,也就是本次读取数据属于上一次输入的数据,导致读取的数据不正确。下面使用例子演示不清空缓冲区所导致的问题:

int main() {

	char password[20] = { 0 }; //定义一个字符数组,用来存储输入的密码
	int ch = 0;
	//第一次输入
	printf("请输入密码:");
	scanf("%s", password);    //password为数组名,数组名为首元素地址,因此无需&

	//第二次输入
	printf("确认密码(Y/N)?: ");
	ch = getchar();

	//计算
	if ('Y' == ch)
		printf("\n YES! \n");
	else 
		printf("\n NO! \n");

	return 0;
}

结果输出:
在这里插入图片描述

图2.1

分析结果: 当第一次输入时,输入数据123456后并按下回车键,第一次输入完毕;用户并没有机会再次进行输入操作,程序立即进行条件判断,程序结束。

ch = getchar();

上面这句语句,直接从缓冲区读取到了一个换行符,用户并没有进行二次输入。下面利用图片演示出现这种现象的缘由。
在这里插入图片描述

图2.2
由上图2.2可知,由于第一次输入的换行符在缓冲区没有清除,导致使用getchar()进行第二次输入时,将换行符读取作为第二次输入的结果,导致读取数据不正确。

结论: 在某些场景下,要及时清空缓冲区,以保证读取数据的正确性。

2.2 利用getchar()清空缓冲区

getchar()函数的作用是每次向缓冲区读取一个字符并返回ASCII值,则可以通过循环读取缓冲区中的数据,直到读取到\n时停止。此时,清除了上次的输入。代码如下:

//清空缓冲区
while ((ch = getchar()) != '\n') {
	;
}

利用上面这段代码即可清空缓冲区。下面是对2.1节代码改进的完整代码。

int main() {

	char password[20] = { 0 }; //定义一个字符数组,用来存储输入的密码
	int ch = 0;
	//第一次输入
	printf("请输入密码:");
	scanf("%s", password);    //password为数组名,数组名为首元素地址,因此无需&

	//清空缓冲区
	while ((ch = getchar()) != '\n') {
		;
	}

	//第二次输入
	printf("确认密码(Y/N)?: ");
	ch = getchar();

	//计算
	if ('Y' == ch)
		printf("\n YES! \n");
	else 
		printf("\n NO! \n");

	return 0;
}

输出结果:
在这里插入图片描述

图2.3

分析结果:
利用getchar()清空缓冲区之后,第二次输入成功,用户读取的数据与第二次输入一致。
结论: 利用getchar()成功清空缓冲区。


总结

利用getchar()清空缓冲区只是c语言的其中一种方法,其他方法等时间有空再娓娓道来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值