关于scanf()函数的细节

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解决。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值