通过scanf和getchar了解缓冲区

今天浅谈一下getchar和scanf以及所谓的缓冲区

当我们想让最后选择语句输出b==y时,运行下面的代码时问题就出现了— 

#include <iostream>
#include <string.h>

int main() {
	char a[] = {};//定义空字符串数组
	int b = 0;
	scanf("%s", &a);//在缓冲区将回车前的数据取走('\n')
	printf("%s\n", a);
	b = getchar();//getchar再缓冲区取走的是\n
	if (b == 'y') {
		printf("b==y");
	} else {
		printf("else");//所以此代码执行
	};
}

 为了节省大家时间我将结果也复制到下面了

 可以看到scanf并没有取走全部数据只是取走了空格前的数据,这也正是scanf与getchar的区别之一(getchar会一一取走缓冲区的数据包括空格,包括回车('\n'))

描述问题:当我们输入scanf数据后,getchar并没有让我们在界面进行交互,而是直接返回else的代码这是为什么呢?

解释:原因其实很简单,我们在键盘输入的字符并不会直接被提取,而是会进入缓冲区,我们的scanf和getchar会从中取数据然后将它再显示到我们的交互界面中,scanf将‘123’提取出来了之后,getchar会自动提取缓冲区后面的一位字符——空格,我们的变量b也就接收了空格字符,总而言之,都是缓冲区里面的东西有剩余导致下面的getchar吃“剩下的”这才执行了else。

解决问题思路:核心就是我们要将缓冲区的数据清空,让下面的代码顺利执行,既然scanf遇到空格就摆烂了,我们就用getchar去给他擦屁股,只能“一点一点”的,可以用while循环搭配getchar代码如下——

#include <iostream>
#include <string.h>
int main() {
	char a[] = {};
	int b = 0;
	int c = 0;
	scanf("%s", &a);//将回车前的数据取走('\n')
	printf("%s\n", a);
	while ((b = getchar()) != '\n') {
		;
	};//while 循环依次取走缓冲区的数据,直到取走'\n'后停止循环
	c = getchar();
	if (c == 'y') {
		printf("c==y\n");
	} else {
		printf("else");//所以此代码执行
	};
}

此时我们的结果是

 正如结果我们得到了if语句下的c==y(之前是b==y,改成了c==y,都是if语句下的)

我们用while循环里面加了(b = getchar()) != '\n'),当条件满足执行该条件,我们的getchar函数就可以从缓冲区里面拿东西给我们看了一直到回车(‘\n’),当缓冲区的东西拿完了,我们再去执行下面的语句就不会出错了。

希望这篇博客可以让大家在学习中更好理解。有问题可以随时提出,这将是我最大的动力。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值