关于scanf很多人不知道的小秘密

今天忽然想到一个问题,假如我利用scanf想给变量a输入一个%d的整数,结果不小心输入了一个字符串yf或者是123ff后会怎么样呢?

哈哈,自己测试了一下,结果发现,当你输入的时123ff即前面是整数后面是字符串时,编译器会将前面的123赋值给变量a,而后面的ff字符串仍然会存在于缓冲区内,当你输入的时ff123或者yf时,编译器不会将你输入的任何东西给变量此时变量的值是随机的,如果此时输出变量时,有些编译器会默认给0,而你所输入的会全部储存在缓冲区内。此时就会很危险,甚至会出现死循环!!如何解决呢?,下面通过一个例题帮助大家,话不多说,下面就通过一道简单的例题帮助大家理解吧!


      这个例题就是讨论我想要你输入1-9中的一个数,结果我们输入的数字大了、小了或者错误了怎么办呢?通过代码我们知道,如果输入不正确会有各种方式提示你输入错误,并且要求你重新输入,没有放源代码是想让大家多练习代码,同时图片看起来也舒服,源代码会放在最下面。

       分析:

       1、首先我们定义一个字符串变量c(char c),和整型变量a(int a),a,c不用赋初始值的(那是我调试时赋值的,忘了删除了);

  2、提示让我们输入1-9范围内的整数;

 3、利用getchar检查是否能获取到除了\0以外的字符串,如果没有,说明我们输入的是整数,再检查输入值是否在1-9之间,

不是的话需要返回重新输入,利用了goto(切记goto不要滥用,但有时候又特别方便);

 4、如果检查出缓冲区还有其他字符时怎么办呢?当然要先清零了,不然返回到scanf,本想再次输入,结果就编程了死循环

了,痛苦啊,怎么清空呢?当然是gerchar了,我把你取完了你不就没了吗,是不是?

 5、既然你第一次输入错误了,那这次肯定要提醒重新输入了,同时不忘了警告一次,我让你输入整数你给我整别的东西,

不是故意开玩笑的啊,下次不要了哦。

以上就是说明注意不要让输入缓冲区留下多余的内容,否则很危险的;第二如何去清除输入缓冲区的错误内容。

如果大家有更好的建议,特别欢迎留言,谢谢!

代码奉送如下:

/**************************************************************
 *Title:A little secret about using "scanf"
 *Author:Wenfei6316
 *Date:Jan 28, 2018
 *************************************************************/
#include<stdio.h>
int main(int argc, const char *argv[])
{
char c;
int a;
printf("Please input a number for 1 to 9:\n");
exit:
scanf("%d",&a);
if(c=getchar()=='\n')
{
if(a>0&&a<=9)
{
printf("Congratulations, you input the correct number!\n");
printf("The correct number you inputed is: %d.\n",a);
}
//If you input the number not in 1 to 9, what you want to do?
else 
{
printf("You are wrong! Please input again:\n");
goto exit;
}
}
//If you don't input the digit but the character string, what you want to do?
else
{
printf("Oh my god, you are kidding me! Number not others!\n");
while(c=getchar()!='\n')
{}
printf("Please input again:\n");
goto exit;
}


return 0;





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值