今天浅谈一下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’),当缓冲区的东西拿完了,我们再去执行下面的语句就不会出错了。
希望这篇博客可以让大家在学习中更好理解。有问题可以随时提出,这将是我最大的动力。