嵌入式学习8(scanf函数的注意事项)

时间:2022-05-22 01:51:59

scanf

1、 一条语句对多个变量复制

Ø  注意用户的输入要与设定一致

如果为scanf("%c%c%c"),那么输入的时候就必须连续输入3个字符,中间不能有任何空格逗号或者回车符等分开

如果是scanf("%c,%c,%c"),那么输入3个字符的时候中间就必须用一个逗号分隔。

Ø  scanf("%d%c%d",&a,&f,&b)当类型有区别时,系统会自动区别,即输入1+2再回车时,a为1,f为+,d为2

Ø  当输入完整数或字符时,后面还需要输入字符时,要注意避免输入的字符变成回车符或空格(因为回车和空格也是字符,而且系统具有自动识别赋值功能)

如:scanf("%c%c%c",&a,&b,&c);输入1空格2空格3回车后,a=’1’ b=空 c=’2’

scanf("%c",&a);scanf("%c",&b);输入1回车后,a=’1’ b=回车

解决方法:

1)输入添加空白字符(空格)

   scanf("%c",&a);

   scanf(" %c",&b);

   printf("%c\n",a);

 输入a空格b回车后,a=’a’,b=’b’

2)用getchar()吃掉回车或空格  %c吃掉

scanf("%c",&a);

getchar();

scanf("%c",&b);

输入a空格b回车后,a=’a’,b=’b’

    3)用%d吃掉

 scanf("%d",&x); /*此时输入一串数字并回车,变量x将正常接收到输入的整数*/
        scanf("%d",&y); /*若此时输入的是字母而不是数字,比如输入“s”并回车*/
                    /*那么变量y将不会接收到任何字符或数字,其值保持原样,不发生任何改变*/
        scanf("%c",&a); /*此时变量a将接收到上一步输入的字母*/
                                  /*即变量a中存储的字符将是"s",而不是回车符*/

因为回车符并没有被送进int类型变量中,而是在异常的字符输入后,被自动清除了。

为了方便记忆我理解为,%d可以吃掉之前的空格(回车),而%c会认亲把起当自己的输入

   4)用fflush(stdin);清除缓冲区

 

 

scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。 
        ① 遇空格、“回车”、“跳格”键。 
        ② 遇宽度结束。 
        ③ 遇非法输入。

 

 

 

 

 

 

Ø  对于 int a[10];

scanf("%s",&a);

printf("%s",a);

输入:I love you回车后

输出只有I,因为scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"loveyou!"还在键盘缓冲区。scanf()函数每次扫描stdin流,残存信息仍在stdin中

用下面的代码可以验证

char str[80]; 
    char str1[80]; 
    char str2[80]; 
    
   scanf("%s",str);/*此处输入:I love you! */ 
   printf("%s",str); 
    sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/ 
   scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描   */ 
   scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描    */ 
   printf("/n%s",str1); 
   printf("/n%s",str2); 
    return 0; 
}
输入:I love you! 
输出:I 
      love 
      you!