scanf()是C中用的较多的一个输入函数。
说明:此文章中的[ space ] [tab] [enter] 分别表示键盘上的空格键,tab键,enter键
基本用法:scanf("转换说明符",变量地址);
转换说明符的作用有2个,一:占位,与后面的变量地址一一对应。二:表明输入数据的形式
scanf()的返回值
scanf也是有返回值的。当输入并读取正确,他就是返回成功读取数据项目的个数,若全部输入读取错误,就返回0。遇到文件结尾,则返回EOF。
例子1:
#include <stdio.h>
int main(void)
{
int a,b,c;
c=scanf("%d %d",&a,&b);
printf("a=%d b=%d\n",a,b);
printf("%d\n",c);
return 0;
}
输入:1 [space] 2
输出:
a=1 b=2
2
//
输入:m [space] 2 //错误的输入
输出:
a=垃圾值 b=垃圾值
0
输入数字
1)输入一个整数
scanf( " %d " , &a ); //注意:不要在%d后面加\n
工作特点:此时,scanf( ) 会扫描输入的字符。如果我们在输入的数据前输入一些空白符(空格,Tab,Enter等,这些是光标的一些行为,不会显示出字符),它会跳过这些空白符,因为转换说明符%d告诉它:输入的数据是一个整数。然后继续扫描。直到它遇到一个非空白字符,他就会读取(当然,不正确的输入也会读取,比如:m或者@或者~等等,但是+ - 正负号不是错误输入,scanf会正确读取)。当它扫描到一个数字,比如2,scanf就会读取,同时检查后面的数据是否也是数字,若是,读取,在检查下一位,如此重复。若下一位不是数字,比如空白符,或者符号,字母,就结束读取,它认为整数读取结束了。
例子:
scanf( " %d " , &a );
输入:[space] [enter] [tab] 2
输出:2
/
输入:m2 (错误输入)
输出:一个不可预测的垃圾数字
/
输入:+2
输出:2
输入:-2
输出:-2
输入:2m23
输出:2
//
输入:2 [space] [enter] [tab]
输出:2
2)输入多个整数(只讨论正确输入)
scanf(" %d , %d ", &a , &b );
输入:23,22
//
scanf(" %d %d ", &a , &b );(中间有空格)
输入: 23 22 (中间有空格)
//
3)scanf的一些修饰符
scanf(" %3d " , &a ); //作用:取输入数字的前3个赋值给a,其余的跳过
输入:123456
输出:123
//
scanf(" % * 3 d % d ", & a ); //跳过前3个数字,把后面的数字赋值给a
输入:123456
输出:456
4)输入浮点数
原理同上,此时 - + . 这3个符号都是合法符,正确输入即可。
输入一个字符 (2种情况)
情况1:scanf("%c",&ch1)
情况2:scanf(" %c",&ch1) //%c前有一个空格
区别:第1种情况是读取输入的第一个字符(包括非空白字符,如空格,tab。。。。),后者是读取第一个非空白字符。
例子:
情况1:scanf("%c",&ch1)
输入:[space] a
输出:[space] //在显示器上看不到字符,仅仅是一个空格
情况2:scanf(" %c",&ch1)
输入:[space] a
输出:a
{
int c;
char ch1,ch2;
c=scanf("%c %c",&ch1,&ch2); //第7行//第一个%c前无空格,第二个%c前有空格
printf("ch1:%c ch2:%c\n",ch1,ch2);
printf("%d\n",c);
return 0;
}
输入:[space] [space] a
输出:
ch1: ch2:a
2
解析:结果是:ch1得到空格,ch2得到字母a。很明显:第一个[space] 空格符赋值给了ch1,而紧接着的第二个[space] 空格符没有赋值给ch2,而是把a赋值给了ch2。
//
改1第7行代码:c=scanf("%c%c",&ch1,&ch2);//去掉了第2个%c前的空格
输入:[space][space] a
输出:
ch1: ch2:
2
解析:此时,ch1和ch2都成功得到空格符,丢弃了字符a,因为char类型只能是一个字符。
/
改2第7行代码:c=scanf(" %c %c",&ch1,&ch2); //2个%c前都有空格
输入:[space] [tab] a [tab] [tab] [space] b
输出:
ch1:a ch2: b
2
解析:这种情况下,无论空白符和非空白符怎么组合输入,都只取输入的前2个非空白符非别赋值给ch1和ch2。因为2个%c前都有空格,所以他们都只接受非空白符。
输入一个字符串
scanf("%s",str1);
输入:[space] [tab] =3.1#415n9
输出:=3.1#415n9
///
scanf("%s",str1);
输入:[space] [tab] 3.1#415n9 [space] 123
输出:3.1#415n9 (后面的123没有读取)
%s 告诉scanf读取的是一个字符串,开始遇到的空白符会跳过,当第二次遇到空白符,就结束字符串的读取,所以scanf读取字符串时不解释空格,这种情况可以用gets解决。