C语言打印数组最大值始终输出0的问题排查
C语言数组最大值计算始终输出0的修复方案
问题根因
最大值计算逻辑存在3个明确错误,直接导致输出结果异常:
- 数组越界访问:定义的
num[100]数组合法下标范围是0~99,初始化max时读取num[100]属于越界操作,拿到的是内存里的随机垃圾值,不是有效输入的数值 - 遍历范围错误:通过
sizeof(num)/sizeof(num[0])算出的是数组固定总长度100,但用户实际只输入了n个有效元素,数组剩余未赋值的位置存储的是未初始化的随机值,遍历全量100个位置会引入无效值参与比较 - 类型不匹配:定义
max为int整型,但数组存储的是float浮点型数值,比较、赋值过程中会出现类型截断,最后用%d整型格式符打印浮点值,也会触发输出格式错误
修复方法
直接替换原代码中最大值计算的问题段即可,修复逻辑:
- 将
max类型改为float,和数组元素类型保持一致 - 初始化
max为第一个有效输入元素num[0],避免越界访问 - 遍历范围限定为用户实际输入的
n个元素,不遍历未赋值的数组位置 - 打印最大值时使用
%.2f浮点格式符,和变量类型匹配
修复后的完整可运行代码:
#include <stdio.h> int main() { int n; // 存储用户输入的数值个数 int order_number; // 输入计数 float max; // 存储最大值,类型改为float匹配数组元素类型 float num[100], sum = 0.0, average; printf("Enter how numbers to be counted: "); scanf("%d", &n); while (n > 100 || n < 1) { printf("The entered number could not handle 100 above or below 1\n"); printf("Please enter a number again: "); scanf("%d", &n); } for (order_number = 0; order_number < n; ++order_number) { printf("%d. Enter number: ", order_number + 1); scanf("%f", &num[order_number]); sum += num[order_number]; } average = sum / n; printf("The average is %.2f\n", average); // 修复后的最大值计算逻辑 max = num[0]; // 初始值设为第一个有效输入元素,避免越界 for (int i = 1; i < n; i++) // 仅遍历用户实际输入的n个元素 { if (num[i] > max) max = num[i]; } printf("Largest element present in given array: %.2f\n", max); // 用浮点格式符输出 return 0; }
补充说明:即使用户输入全为负数,用第一个元素初始化max的逻辑依然成立,不会出现初始值比所有输入值大导致结果错误的问题。
内容的提问来源于stack exchange,提问作者Dave Balanghig
相关产品推荐
相关产品推荐

