scanf的缓冲区问题

                       Scanf函数的缓冲区问题

scanf输入字符串、整型、实型等数据判断的方式都一样,回车、空格、tab键都认为是一个数据的结束但是字符不同于字符串,回车,空格很可能被当成字符被输进去,要特别注意!回车、空格等都有对应的ASCII码,所以用scanf输入字符时要小心这些东西被当成字符输进去,而输入字符串和整型、实型等数据时这些都被当成分隔符而不会被输入到字符数组或变量里。当然如果输入格式不是"%s%s"而是"%s,%s"分隔符就是逗号了。

 

直接举例子

#include  <stdio.h>

Int main()

{

char  src[100];

char  str[100];

 

scanf(%s,src);

scanf(%s,str);

 

printf(src   =  %s\n,src);

printf(str   =  %s\n,str);

 

return  0;

}

 

输入

hello回车 world 回车

运行结果为

src = hello

str = world

总结一下就是:

如果scanf输入的不是字符,那么分隔符为回车,空格、tab键时,两个数据之间的分隔符只是起区别两个数据的作用,把分隔好的两个数据分别赋值到各自定义好的变量数组或字符串中去,两个数据之间的分隔符被从缓冲区读出但是不起任何作用,当然最后一个'\n '会被留在缓冲区内,除非用getchar();scanf("%c",&c);把它读出来。

 例2

#include  <stdio.h>

int main()

{

    char src[100];


    scanf("%s",src);

    printf("src = %s\n",src);


    return 0;

}

输入 hello空格world(即hello  world)

运行结果

src = hello

分析:当输入空格的时候,就被当成了结束符,只有hello被输入到字符数组src中


解决方法:将输入语句改成:scanf("%[^\n]",src);即可



对于字符

也是直接举例子

#include  <stdio.h>

 

int  main()

{

int  a;

char src;

scanf(%d,&a);

scanf(%c,&src);

 

printf(a = %d\n,a);

printf(src = %c\n,src);

    return 0;

}

输入

123回车

 

运行结果

a = 123

src =

 

分析:回车作为ASCII码输入到了缓冲区,直接给了字符src

 

解决方法:可在两个输入语句中间加入一个 getchar();

或者在字符的输入语句%c前面加上一个空格 即改成scanf(  %c,&src);

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值