You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改说明

  1. 数组初始化:定义b和c时用= {0}初始化所有元素为0,确保未填充的位置显示0
  2. 计数器机制:用count_b和count_c分别追踪b和c已填充的元素个数,通过数学计算将一维计数器转换为三维数组的索引(j为第一维,k为第二维,l为第三维),实现顺序填充
  3. 越界保护:添加count_b < B_C_SIZE和count_c < B_C_SIZE的判断,避免数组越界写入
  4. 简化输入校验:移除冗余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:45:00