使用scanf时,检测输入字符是否正确

PS:旧博文,发表于2017年8月21号,没想到我当年还没上大学就开始看c了。

这几天趁着放假期间,比较闲,准备学一门编程语言,因为开学要考C,就打算先学下C,然后直接入python。(虽然我两个都学过一点语法,一直没有深入)

╮(~▽~)╭

 

但在学习C的过程中也带来了一些启发(虽然我才学了几章(?ω?) )

其中格式各类的数据类型真是百花齐放。

而在学习scanf函数时候我遇到了一个问题

初学的时候写法如下

#include<stdio.h>

int number;

int main()

{

scanf("%d",&number);

printf("%d.\n",number);

}

输入数字后输出一个数字

当然像我这样比较调皮的人就会用一些奇奇怪怪的东西

比如我会输入a,而不是输入一个数字

这样就会导致一个错误,程序无法显示正确的结果。

为了解决这个问题,我上网找资料。

虽然没找到现成的,但是还是找了到思路,可惜自己想出来后却找到了相关的。

 

我们知道scanf是有返回值的(在C primer plus的前几章有粗略的提到过),我的想法是结合while函数一起使用。

具体代码如下

#include<stdio.h>

int number;

int main ()

{

    while( scanf("%d",&number) ?!= 1)

    {

        printf("enter a int number.\n");

    }
  printf("%d\n",number);
}

这样的话,如果输入不符合类型的字符scanf的返回值必然不为1,从而跳进一个while循环。

我们进行测试,分别输入1和q

z:~/work$./a.out 
1
1.
z:~/work$./a.out 
q
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.
enter a int number.

我们发现数字可以正确的输出,而输入q发现一直在循环输出enter a int number.。

看原代码可以知道,程序调到

while( scanf("%d",&number)  != 1)
 { 
printf("enter a int number.\n"); 
}

这个循环体中,然后出不来了。

但是为什么会这样呢?

 

明明是我先~~啊走错片场了。

 

其实原因还是出现在scanf这个上,我们知道scanf是使用空白(换行符,空格,制标符)把输入分成多段.

使用scanf("%d",&number);为例

scanf在输入时会检测是否是数字,如果是则保存这个数字并读取下个字符。如果scanf读到了非数字,这认为输入结束,然后把非数字放回。这意味下一次读取时,,首先读取到的是这一个非数字,而不是用户的输入。

解决办法也很简单使用getchar()拿走字符就好。

代码如下

#include<stdio.h>
int number;
int main ()
{ while( scanf("%d",&number) != 1)
        {
                while(getchar()!='\n')
                { printf("enter a int number.\n");
                }
        }
        printf("%d.\n",number);
}

while(getchar()!=’\n’)的意思是释放一个字符,直到’\n’。

使用while循环有一个好处就是,如果用户输入了多个字符,getchar都可以一一拿走。

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值