今天忽然想到一个问题,假如我利用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;
}