C语言求输入整数序列最值程序输出异常求助
问题分析与修复
核心错误点
- 输入逻辑错误:你的代码每次循环先读取一个整数,接着读取一个字符串判断是否结束。但示例输入中,第二个整数
2会被scanf("%4s", line)读取,而非存入val参与最值计算,导致这个数被忽略,最终最小值停留在5,最大值为9。 - 初始值设置不合理:
min = 10和max = -1是硬编码的固定值,如果输入的所有数都大于10,最小值会错误保留10;如果所有数都小于-1,最大值会错误保留-1。
修复后的代码
#include <stdio.h> #include <string.h> #include <limits.h> // 用于INT_MAX和INT_MIN int main() { char line[1000]; int val, min, max; int first_input = 1; // 标记是否为第一个有效输入的整数 while (1) { // 先读取每行内容到字符串,优先判断是否结束 if (scanf("%999s", line) != 1) { break; // 输入出错时退出循环 } if (strcmp("done", line) == 0) { break; } // 将字符串转为整数,校验输入有效性 if (sscanf(line, "%d", &val) != 1) { printf("无效输入,请输入整数或done\n"); continue; } // 用第一个有效整数初始化最值 if (first_input) { min = val; max = val; first_input = 0; } else { if (val < min) min = val; if (val > max) max = val; } } // 确保有有效输入才输出结果 if (!first_input) { printf("Maximum %d\n", max); printf("Minimum %d\n", min); } else { printf("没有输入任何整数\n"); } return 0; }
修复说明
- 调整输入逻辑:先读取每行内容到字符串,先判断是否是
done,非结束指令再转为整数处理,确保每个输入的整数都能参与最值计算。 - 动态初始化最值:用标记位判断第一个有效整数,将
min和max初始化为该值,避免硬编码初始值带来的边界错误。 - 增加输入校验:判断字符串转整数是否成功,处理非整数的无效输入,同时判断是否有有效输入,避免无整数时输出错误结果。
内容的提问来源于stack exchange,提问作者bjj
相关产品推荐
相关产品推荐

