耐心、专心、细心
前言
本篇文章主要介绍关于c语言中缓冲区的分类并利用getchar()清空缓冲区
一、缓冲区的分类
缓冲区:用于平滑两种不同速度的硬部件或设备之间的数据传输,在内存开辟的一个存储区,专门用于临时存放I/O操作的数据。
从输入输出设备角度,缓冲区分为:输入缓冲区和输出缓冲区;
从缓冲区的类型角度,缓冲区分为:全缓冲区、行缓冲区、不带缓冲区。
二、利用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;
}
结果输出:
分析结果: 当第一次输入时,输入数据123456后并按下回车键,第一次输入完毕;用户并没有机会再次进行输入操作,程序立即进行条件判断,程序结束。
ch = 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;
}
输出结果:
分析结果:
利用getchar()清空缓冲区之后,第二次输入成功,用户读取的数据与第二次输入一致。
结论: 利用getchar()成功清空缓冲区。
总结
利用getchar()清空缓冲区只是c语言的其中一种方法,其他方法等时间有空再娓娓道来。