先来看一个案例,思考一下结果是什么,再看实际的运行结果
#include
int main() {
char a = 0, b = 0;
scanf("%c", &a);
scanf("%c", &b);
printf("%c, %c 123", a, b);
return 0;
}
图1:输入a之后回车
图2:输入a b之后回车
图3:输入ab之后回车
为什么三种情况的输入只有输入ab才能获取到b的值呢?
先来分析scanf函数,它从标准输入设备(键盘) 读取输入的信息,不会直接赋值给变量,而是先储存到一个缓冲区中,也就是说你输入的是什么都先找个地方给存起来,然后再从缓冲区中将数据赋值给变量。
也就是说
图1,输入的值是a\n,变量a获取到的值是'a',变量b获取到的值是'\n'(回车);
图2,输入的值是a b,变量a获取到的值是'a',变量b获取到的值是' '(空格);
图3,输入的值是ab,变量a获取到的值是'a',变量b获取到的值是'b'。
知道了什么原因造成无法获取到正确的数据,那么怎么解决这个问题呢?
方法一:按照特定格式输入,一次性读取多个字符
#include
int main() {
char a = 0, b = 0;
scanf("%c %c", &a, &b);
printf("%c, %c 123", a, b);
return 0;
}
按照特定格式输入,一次性读取多个字符.jpg
以上案例输入a b后变量a与b的值分别是'a'与'b'.
方法二:占位符前面用一个空格跳过空白字符
#include
int main() {
char a = 0, b = 0;
scanf("%c", &a);
scanf(" %c", &b);
printf("%c, %c 123", a, b);
return 0;
}
占位符前面用一个空格跳过空白字符
以上案例输入a b后变量a与b的值分别是'a'与'b'.
方法三:利用fflush函数清除缓冲区
#include
int main() {
char a = 0, b = 0;
scanf("%c", &a);
fflush(stdin);
scanf("%c", &b);
printf("%c, %c 123", a, b);
return 0;
}
方法三有一个弊端,就是每输入完一个scanf函数要获取的数据后需要回车,不然执行清除缓冲区后等于白输入。
例如:输入a b后回车,光标闪烁,控制台依然在等着键盘输入数据,这个时候变量a已经拿到数据'a',但字符'a'后面的" b"已经被清除,现在缓冲区是没有任何内容的,需要等待键盘输入数据。