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
相关产品推荐
相关产品推荐

