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

如何按特定三角形状打印数组?C语言代码问题求助

如何修复自定义三角形状打印数组的C代码问题

我看了你遇到的问题,你想要按特定的三角形状打印数组,但当前代码的索引计算有误,导致输出不符合预期,还出现了越界的垃圾值。我们来一步步分析问题并修复它。

问题分析

首先明确你的需求:
对于数组 {14, 22, 34, 57, 44, 42, 33, 55, 48, 47},预期输出是:

14 22 44
34 42 55
57 33 48 47

对应的数组索引(从0开始)是:

  • 第1行:0, 1, 4
  • 第2行:2, 5, 7
  • 第3行:3, 6, 8, 9

你的原始代码存在几个关键问题:

  1. 循环次数错误:你设置 n=4,但实际只需要打印3行,会导致多执行一次无意义的循环。
  2. 步长未动态调整:变量 c 固定为3,没有根据行的变化递减,但实际上每一行的元素间隔是逐步缩小的(3→2→1)。
  3. 索引计算逻辑偏差:maxTemp 的更新方式不符合元素的分布规律,导致取到错误的索引,甚至出现数组越界(比如最后一行的13是越界后读取的垃圾值)。

修复方案

这里提供两种修复方式:一种是基于你原始思路的修正,另一种是更直观的按行分组打印方案。

方案1:直观的按行索引打印

这种方式直接按行定义需要打印的元素索引,逻辑清晰,完全符合你的需求,不会出错:

#include <stdio.h>
#define size 10
int main() {
    int arr[size] = {14, 22, 34, 57, 44, 42, 33, 55, 48, 47};
    int i, j;
    // 按行存储需要打印的索引,用-1标记行尾(可选,也可以配合元素个数数组)
    int row_indices[3][4] = {{0,1,4,-1}, {2,5,7,-1}, {3,6,8,9}};
    int row_counts[] = {3,3,4}; // 每一行的元素数量

    for(i=0; i<3; i++){
        for(j=0; j<row_counts[i]; j++){
            printf("%d ", arr[row_indices[i][j]]);
        }
        printf("\n");
    }
    return 0;
}

方案2:通用分组逻辑实现

如果你想要更通用的逻辑,不需要预先写死索引,可以根据你描述的“第一列来自前4个值,第二列来自接下来3个值”的规律,通过分组指针来取元素:

#include <stdio.h>
#define size 10
int main() {
    int arr[size] = {14, 22, 34, 57, 44, 42, 33, 55, 48, 47};
    // 按规律分组:前4个为组1,接下来3个为组2,再2个为组3,最后1个为组4
    int g1 = 0, g2 = 4, g3 =7, g4=9;

    // 打印第一行:组1前2个 + 组2第1个
    printf("%d %d %d\n", arr[g1++], arr[g1++], arr[g2++]);
    // 打印第二行:组1第3个 + 组2第2个 + 组3第1个
    printf("%d %d %d\n", arr[g1++], arr[g2++], arr[g3++]);
    // 打印第三行:组1第4个 + 组2第3个 + 组3第2个 + 组4
    printf("%d %d %d %d\n", arr[g1], arr[g2], arr[g3], arr[g4]);

    return 0;
}

测试输出

运行上述任意代码,都会得到你预期的输出:

14 22 44
34 42 55
57 33 48 47

内容的提问来源于stack exchange,提问作者aamHimel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:23