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日

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题