黑马程序员技术交流社区

标题: 关于一个意外的死循环问题 [打印本页]

作者: 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。然后下次循环时,非法输入的那个字符还在输入缓冲区,试图录入又失败了,就这样死循环了。
  1. do {
  2.         
  3.         printf("请选择需要执行的运算\n加法请选择 “1”  ,减法请选择 “2” \n");
  4.         while (scanf("%d", &x) != 1) { // scanf会返回成功录入的参数的个数,这里是1
  5.             printf("你输入的有误请重新输入\n");
  6.             scanf("%*[^\n]%*c"); // 把缓冲区非回车字符全部读入,然后把回车也读入,*意思是丢弃不保存到变量
  7.         }                                 // 这样一旦有非法输入就会清空缓冲区下次就可以正常录入了
  8.         
  9.     } while (x < 1 || x > 2);
复制代码

作者: 15021367785    时间: 2015-1-6 10:34
从今以后 发表于 2015-1-5 22:32
scanf("%d", &x);遇到输入字符时,因为是非法输入,就没有录入了,这时候x是一个未知的值,我这里试了下是1 ...

能理解你说的,还是不知道有什么方法解决
作者: 从今以后    时间: 2015-1-6 13:03
15021367785 发表于 2015-1-6 10:34
能理解你说的,还是不知道有什么方法解决

你用上面那段作为录入功能部分就好了啊,就是非法输入后把缓冲区清掉,要是win系统直接fflush(stdin);就可以了的,不用上面那些。
作者: 15021367785    时间: 2015-1-8 14:07
明白了, 谢谢 了





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2