C语言循环读取不同长度数组求和代码运行异常问题咨询
问题分析
- 数组长度读取逻辑位置错误:你只在循环外读取了一次数组长度
x,循环处理每个数组的过程中没有重新读取下一个数组的长度,导致程序始终按照第一次读取的长度5来读取每个数组的元素,自然会把下一个数组的长度值8当成当前数组的元素处理。 - 变长数组定义位置不合理:当前你在循环外定义了长度为
x的变长数组line,后续如果数组长度变化,这个数组的长度也无法同步更新。另外你的需求仅需要求和,完全不需要存储所有数组元素,也可以省略数组定义减少不必要的内存开销。 - 存在重复定义变量
i的问题:外层循环和内层循环都定义了同名变量i,虽然C99及以后标准支持内层变量遮蔽外层变量,但属于不规范的写法,容易引发逻辑混淆。
修复方案
调整读取逻辑,把数组长度读取的代码放到外层循环内部,每处理一个数组前先读取当前数组的长度。你可以选择保留数组存储元素,也可以直接边读边累加省略数组,这里提供两种实现:
方案1:省略数组直接求和(最优,无额外内存开销)
#include <stdio.h> int main(){ int total_arr, arr_len; int case_num = 1; int sum = 0; int num; // 读取数组总个数 scanf("%d", &total_arr); for(int i=0; i < total_arr; i++){ sum = 0; // 每轮先读取当前数组的长度 scanf("%d", &arr_len); for(int j=0; j < arr_len; j++){ scanf("%d", &num); sum += num; } printf("Case #%d: %d\n", case_num, sum); case_num++; } return 0; }
方案2:保留数组存储元素的实现
#include <stdio.h> int main(){ int total_arr, arr_len; int case_num = 1; int sum = 0; scanf("%d", &total_arr); for(int i=0; i < total_arr; i++){ sum = 0; scanf("%d", &arr_len); // 每次根据当前数组长度定义变长数组 int line[arr_len]; for(int j=0; j < arr_len; j++){ scanf("%d", &line[j]); sum += line[j]; } printf("Case #%d: %d\n", case_num, sum); case_num++; } return 0; }
内容的提问来源于stack exchange,提问作者Kang Nul
相关产品推荐
相关产品推荐

