C语言读取命令行数字求最大最小值及计数实现求助
问题根因
- 最小值计算的循环条件完全错误:你写的
for (int j = 1; j > argc; --j)初始就不满足判断条件,循环从未执行,min变量一直停留在初始的INT_MAX没有更新 - 边界初始化不合理:用int类型的边界值
INT_MIN、INT_MAX给double类型的最值做初始化,如果输入的浮点数超出int的取值范围,会出现判断逻辑错误 - 重复遍历参数冗余:两次遍历命令行参数没有必要,一次遍历就可以同时完成最大值、最小值计算和有效数字统计
修复后代码
#include <stdio.h> #include <float.h> int main (int argc, char **argv) { // 初始化适配double全范围取值 double max = -DBL_MAX; double min = DBL_MAX; int valid_count = 0; // 一次遍历完成所有计算 for (int i = 1; i < argc; i++) { double n = 0; if (sscanf(argv[i], "%lf", &n) == 1) { valid_count++; if (n > max) { max = n; } if (n < min) { min = n; } } } if (valid_count == 0) { printf("no valid numbers read\n"); } else { printf("%d numbers read; max: %.2lf; min: %.2lf\n", valid_count, max, min); } return 0; }
实现说明
- 新增
valid_count变量,每次sscanf成功转换数字就加1,即可统计有效数字总数 - 最值初始化改用
<float.h>中定义的double类型边界值,适配浮点数的全取值范围 - 合并两次循环为一次,遍历所有命令行参数时同步做最大值、最小值判断,降低不必要的性能开销
- 输出格式按需求保留两位小数,同时增加了无有效数字输入的容错处理
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

