一、什么是输入函数?
输入函数scanf是读取键盘输入 (即标准输入),C语言未提供输入输出关键字,其输入输出由标准库函数提供。
在使用scanf函数时,如果没有输入内容时scanf会卡住(即阻塞)。
二、输入函数格式
以输入int类型数据为例格式如下:
scanf("%d",&i);
三、解析输入函数格式
1、为何要有%d、%f······此类?
因为scanf是以字符串形式输入,再按照%d、%f······此类进行类型匹配,把输入的内容按照相对应的数据类型进行转化为相对应类型。
2、为何要取地址?
scanf从标准输入里读取输入数据,scanf把标准输入里的内容放到某个空间里,因从必须取地址。
四、scanf原理
1、问题现象:
测试代码:
输入整型i和字符型c,再输出整型i和字符型c:
#include <stdio.h>
int main() {
int i;
char c;
scanf("%d%c",&i,&c);
printf("i=%d c=%c\n",i,c);
return 0;
}
可以看到此处输入函数中 %d和%c中没有用空格隔开。
前文提到为进行输入时,scanf是会阻塞的当时此处并没有对字符类型进行输入,也没有出现阻塞现象 。倒置输出结果没有c的值。
2、原理解释
Ⅰ 前文讲解过scanf输入是以字符串行书输入的,你输入int i = 10时,你不仅仅是输入了一个10,你其实是输入了10\n到标准输入缓冲区。
Ⅱ 输入之后再经过scanf匹配类型时读取走了10去匹配%d这个整型,而标准输入缓冲区类留下了\n。
Ⅲ 在scanf需要匹配%c时标准输入缓冲区类有“\n”,而在匹配字符类型时是不会忽略“\n”
和空格的,scanf就读取匹配了“\n",因从不需要再次进行输入,所以不会发生阻塞。
五、解决办法
1、使用fflush
格式如下:
fflush(stdin);
实例:
#include <stdio.h>
int main() {
int i;
char c;
scanf("%d",&i);
fflush(stdin);
scanf("%c",&c);
printf("i=%d c=%c\n",i,c);
return 0;
}
可以看到加入fflush之后函数实现了我们想要的输出,因为fflush(stdin)的作用就是清空标准输入缓冲区。
2、混合输入的解决方法
方法:在%c前面敲入空格。
#include <stdio.h>
int main() {
int i;
char c;
scanf("%d %c",&i,&c);
printf("i=%d c=%c\n",i,c);
return 0;
}
解释:
scanf在读取整型、浮点型和字符串时都会自动忽略”\n"和空格等字符,而在匹配字符型时不会自动忽略。