黑马程序员技术交流社区
标题: 关于一个意外的死循环问题 [打印本页]
作者: 15021367785 时间: 2015-1-5 15:27
标题: 关于一个意外的死循环问题
/*题目:程序运行的时候提示下列信息
请输入相应数字选择需要执行的运算:
1 加法
2 减法
用户选择运算后,再提示用户输入两个需要进行运算的整数,输入完毕后就输出运算结果
*/
#include <stdio.h>
int main()
{
int a;
int b;
int x;
printf("请选择需要执行的运算\n加法请选择 “1” ,减法请选择 “2” \n");
for (scanf("%d",&x);x<1||x>2;)
{
printf("你输入的有误请重新输入\n");
scanf("%d",&x);
continue;
}
printf("请输入两个需要运算的整数中间以空格隔开\n");
scanf("%d %d",&a,&b);
if (x==1)
{
int c=a+b;
printf("%d+%d=%d\n",a,b,c);
}
else
{
int d=a-b;
printf("%d-%d=%d\n",a,b,d);
}
return 0;
}
这个代码 在运行选在输入 1或2时 如果用字母代替 就会进入死循环 。百思不得其解,有知道的大神求告知
作者: 从今以后 时间: 2015-1-5 22:32
scanf("%d", &x);遇到输入字符时,因为是非法输入,就没有录入了,这时候x是一个未知的值,我这里试了下是1606416408。然后下次循环时,非法输入的那个字符还在输入缓冲区,试图录入又失败了,就这样死循环了。
- do {
-
- printf("请选择需要执行的运算\n加法请选择 “1” ,减法请选择 “2” \n");
- while (scanf("%d", &x) != 1) { // scanf会返回成功录入的参数的个数,这里是1
- printf("你输入的有误请重新输入\n");
- scanf("%*[^\n]%*c"); // 把缓冲区非回车字符全部读入,然后把回车也读入,*意思是丢弃不保存到变量
- } // 这样一旦有非法输入就会清空缓冲区下次就可以正常录入了
-
- } while (x < 1 || x > 2);
复制代码
作者: 15021367785 时间: 2015-1-6 10:34
能理解你说的,还是不知道有什么方法解决
作者: 从今以后 时间: 2015-1-6 13:03
你用上面那段作为录入功能部分就好了啊,就是非法输入后把缓冲区清掉,要是win系统直接fflush(stdin);就可以了的,不用上面那些。
作者: 15021367785 时间: 2015-1-8 14:07
明白了, 谢谢 了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |