m0_57616435 2021-11-15 11:22 采纳率: 66.7%
浏览 69
已结题

在 C 语言中使用 scanf 时,考虑使用者类型输入错误的情况并给出“错误!”的提示

在程序里,希望从 scanf 里得到一个浮点数,但如果使用者输入了字符,或浮点数后面跟了多余的字符,需要提示使用者并报错。
应该怎么写出这样的语句呢?

double w;
scanf("%lf", &w);

输入:100kg
输出:错误!

输入:one hundred
输出:错误!

输入:100.0
输出:(程序继续)

  • 写回答

2条回答 默认 最新

  • include_iostream_ 2021-11-15 11:28
    关注

    scanf是有返回值的,如果成功输入所有东西,返回值就是成功输入的东西的数量(不会累计)。
    对你的情况而言,你每次只输入一个数,因此scanf成功时会返回1,失败了会返回0或负数。
    返回负数的情况一般是流本身出了问题,返回0(或者少于预期,例如格式串"%d%d"要一次输入两个数,但只返回1时)则是用户输入有误。可以通过这点来判断输入是否成功。
    ====分割线====
    demo:

    char c;
    int t;
    double x;
    while (1) {
        t = scanf("%lf%c", &x, &c);
        // 需要ctype.h 
        if (t == 0 || !isspace(c)) {
            printf("error!\n");
            break;
        }
        printf("Got: %lf\n", x);
    }
    

    原理:正常输入的话,浮点数之间一定有空白符。但考虑到有不正常的输入,事实上浮点数后可能会读到其他东西。我们可以在lf后紧跟着读一个字符,判断是不是空白符(也就是isspace,当字符是空白符时返回非0值)。如果scanf的返回值为0,就说明double没有成功读入,也是有错误的情形。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月23日
  • 已采纳回答 11月15日
  • 创建了问题 11月15日

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集