scanf的正确使用及技巧

它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

使用scanf函数时要加上#include <stdio.h>。

首先从键盘读入键盘缓冲区(buffer)的数据都是以ASCII码存储的(包括回车)。

例如:

#incude<stdio.h>

int main()

{

      char a;

      char b;

      scanf("%c",&a);

      scanf("%c",&b);

      printf("%c%c",a,b);

      return 0;

}

终端操作:w[回车]

                  w

显然这个程序只输入一次,输出一次。

第一次回车后,buffer中的ASCII: XX,0AH(0A是换行的ASCII), scanf会根据格式字符串中的第一个%c从对buffer按字节顺序读取,因为‘\n’也是一个字符,所以当读取到0A时,会将字符‘\n’给变量b。读取数据结束,此时buffer中已经无任何数据了。
     自然打印出来的就是w\n,两个字符。

解决办法是:

 

#incude<stdio.h>

int main()

{

      char a;

      char b;

      scanf("%c",&a);

      getchar();

      scanf("%c",&b);

      printf("%c%c",a,b);

      return 0;

}

当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符,在输入w[回车]时,buffer中的ASCII: XX,0AH(0A是换行的ASCII),getchar 开始读取字符,并显示在屏幕上,此时buffer中是没有数据,在这儿getchar()起到了清除缓冲区的作用,这样,当遇到达尔戈scanf 是,可以正常输入,并显示在屏幕上。

在scanf读取的一个参数是数时,开始输入的空白字符会被忽略,读取数字直到遇到第一字符不是数字就会停止;

读取字符串时,开始的空白字符也会被忽略掉,读取字符【0-9a-zA-Z....](各种可显示字符),直到遇到不是字符停止匹配,(包括空白字符,通常为回车换行),并且在字符串尾添加空字符,(空字符是字符串输出结束字符).

scanf遇到停止字符时,把停止字符还放入键盘字符缓存区中。

匹配格式

 

    int a;

    char x[20];

    printf("Hello, world\n");

    scanf("%d%s",&a,x);

   printf("%d",a)

    printf("%s",x);

    getch();

如果输入.......123 .....hello[回车]

       输出   hello,world

               123hello

如果将输入改成scanf("%dabc%s",&a,x);

输入:....123abc.......hello

输出结果如上

输入:......123ab......hello

输出结果123字符数组输出为乱码。

建议:当此次输入结束时,不管正确与否,都要刷新缓存区,否则有滞留字符干扰下一次的输入,使用getchar().

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值