You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言校验scanf输入数字合法范围时else分支误触发问题

问题根因

你混淆了scanf的返回值和实际读入的用户输入数值:

  • scanf("%d", &uniqueNumber)的返回值是成功匹配、赋值的输入项数量,不是用户输入的数字本身:整数读取成功时固定返回1,读取失败(比如输入非数字内容)返回0,遇到输入流结束返回EOF。
  • 你写的区间判断逻辑用了scanf的返回值x做判断,不管你输入50还是其他合法整数,x的值始终是1,永远满足不了x>9 && x<101的条件,所以无论输入什么数字都会触发else分支打印错误。
修复代码

区间判断要针对存入uniqueNumber的实际输入值做校验,同时要补充scanf读取失败时的缓冲区清理逻辑,避免非法输入导致程序死循环:

for (int i = 0; i < 20; ++i) { // 修正数组下标:C语言数组从0开始,长度20时下标范围0~19,避免越界
    bool flag = true; 
    while (flag) {
        int read_ret = scanf("%d", &uniqueNumber);
        // 处理读取失败场景:清空输入缓冲区残留的非法字符
        if (read_ret != 1) {
            while (getchar() != '\n'); // 读走缓冲区里所有残留内容直到换行
            printf("The number entered is not valid\n");
            continue;
        }
        // 校验实际输入值的区间
        if (uniqueNumber > 9 && uniqueNumber < 101) {
            uniqueArray[i] = uniqueNumber;
            flag = false;
        } else {
            printf("The number entered is not valid\n");
        }
    }
}
补充说明
  • 原代码数组下标从1开始遍历到20,如果uniqueArray定义长度为20,会出现数组越界写入的问题,属于未定义行为,修复时一并调整了下标范围。
  • 打印提示时末尾加\n换行符,可以保证输出立即刷新到控制台,避免打印延迟。

内容的提问来源于stack exchange,提问作者doug22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:24:25