C语言一维数组元素按值拆分至三维数组的代码问题求助
C语言三维数组赋值问题排查与修复
问题根源
你的代码存在三个核心问题:
- 覆盖式赋值:每次遇到符合条件的元素时,通过三层循环将整个三维数组的所有位置都赋值为当前元素,导致之前存入的内容被完全覆盖,最终只保留最后一个符合条件的值
- 未初始化数组:三维数组
b和c没有初始化,未填充的位置会是随机垃圾值,无法满足"剩余位置填0"的需求 - 冗余输入校验:无效输入判断中
if(a[i]<5)属于多余逻辑,只需要校验输入是否小于1即可
修复后的完整代码
#include <stdio.h> #define N 12 #define B_C_SIZE 12 // 2*2*3=12,三维数组总元素数 int main() { int a[N]; int b[2][2][3] = {0}; // 初始化全0 int c[2][2][3] = {0}; int i, count_b = 0, count_c = 0; int j, k, l; // 输入一维数组并过滤无效值 for(i = 0; i < N; i++){ printf("Input %d: ", i); scanf("%d", &a[i]); // 校验输入有效性,确保是正整数 while(a[i] < 1){ printf("\nInvalid Input\nEnter 1 or greater than 1 only\n\n"); printf("Input %d: ", i); scanf("%d", &a[i]); } // 将元素存入对应三维数组,不越界 if(a[i] < 30 && count_b < B_C_SIZE){ // 把一维计数器转换为三维索引 j = count_b / (2*3); k = (count_b % (2*3)) / 3; l = count_b % 3; b[j][k][l] = a[i]; count_b++; } else if(a[i] >= 30 && count_c < B_C_SIZE){ j = count_c / (2*3); k = (count_c % (2*3)) / 3; l = count_c % 3; c[j][k][l] = a[i]; count_c++; } } // 打印一维数组a printf("\nArray 1:\n"); for(i = 0; i < N; i++){ printf("a[%d] = %d\n", i, a[i]); } // 打印三维数组b(小于30的元素) printf("\n\nArray with less than 30:\n"); for(j = 0; j < 2; j++){ for(k = 0; k < 2; k++){ for(l = 0; l < 3; l++){ printf("b[%d][%d][%d] = %d\n", j, k, l, b[j][k][l]); } } } // 打印三维数组c(大于等于30的元素) printf("\n\nArray with greater than or equal to 30:\n"); for(j = 0; j < 2; j++){ for(k = 0; k < 2; k++){ for(l = 0; l < 3; l++){ printf("c[%d][%d][%d] = %d\n", j, k, l, c[j][k][l]); } } } return 0; }
关键修改说明
- 数组初始化:定义
b和c时用= {0}初始化所有元素为0,确保未填充的位置显示0 - 计数器机制:用
count_b和count_c分别追踪b和c已填充的元素个数,通过数学计算将一维计数器转换为三维数组的索引(j为第一维,k为第二维,l为第三维),实现顺序填充 - 越界保护:添加
count_b < B_C_SIZE和count_c < B_C_SIZE的判断,避免数组越界写入 - 简化输入校验:移除冗余的
if(a[i]<5)判断,只保留核心的小于1的无效输入校验
测试输出(对应给定输入示例)
Array 1: a[0] = 1 a[1] = 2 a[2] = 3 a[3] = 4 a[4] = 5 a[5] = 6 a[6] = 31 a[7] = 32 a[8] = 33 a[9] = 34 a[10] = 35 a[11] = 36 Array with less than 30: b[0][0][0] = 1 b[0][0][1] = 2 b[0][0][2] = 3 b[0][1][0] = 4 b[0][1][1] = 5 b[0][1][2] = 6 b[1][0][0] = 0 b[1][0][1] = 0 b[1][0][2] = 0 b[1][1][0] = 0 b[1][1][1] = 0 b[1][1][2] = 0 Array with greater than or equal to 30: c[0][0][0] = 31 c[0][0][1] = 32 c[0][0][2] = 33 c[0][1][0] = 34 c[0][1][1] = 35 c[0][1][2] = 36 c[1][0][0] = 0 c[1][0][1] = 0 c[1][0][2] = 0 c[1][1][0] = 0 c[1][1][1] = 0 c[1][1][2] = 0
内容的提问来源于stack exchange,提问作者TheThirdReign
相关产品推荐
相关产品推荐

