scanf函数不执行?

先来看一个案例,思考一下结果是什么,再看实际的运行结果

#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"已经被清除,现在缓冲区是没有任何内容的,需要等待键盘输入数据。

友情链接:

Copyright © 2022 神龙网游活动站 - 新版本&限时福利聚合 All Rights Reserved.