A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 15021367785 中级黑马   /  2015-1-5 15:27  /  1946 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*题目:程序运行的时候提示下列信息
请输入相应数字选择需要执行的运算:
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时  如果用字母代替 就会进入死循环 。百思不得其解,有知道的大神求告知

4 个回复

倒序浏览
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);
复制代码
回复 使用道具 举报
从今以后 发表于 2015-1-5 22:32
scanf("%d", &x);遇到输入字符时,因为是非法输入,就没有录入了,这时候x是一个未知的值,我这里试了下是1 ...

能理解你说的,还是不知道有什么方法解决
回复 使用道具 举报
15021367785 发表于 2015-1-6 10:34
能理解你说的,还是不知道有什么方法解决

你用上面那段作为录入功能部分就好了啊,就是非法输入后把缓冲区清掉,要是win系统直接fflush(stdin);就可以了的,不用上面那些。
回复 使用道具 举报
明白了, 谢谢 了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马