You need to enable JavaScript to run this app. C语言基于指针实现多变长数组转置打印 求解动态边界方案
优惠活动
大模型
产品
解决方案
定价
更多

C语言基于指针实现多变长数组转置打印 求解动态边界方案

问题原因&解决方案

第一版代码无输出的问题

  • 终止条件逻辑错误:你的指针数组All末尾以NULL作为哨兵,但是第一版代码中判断*Al[z] != "\0",不仅错误对可能为NULL的指针进行解引用,还将int类型的值与字符串常量做比较,类型完全不匹配,直接导致程序运行异常无输出。
  • 循环边界写反:外层循环应该控制行数(最大子数组长度-1),内层控制列数(子数组个数),第一版的边界逻辑完全颠倒。
  • 多余的printf("%d ",x);语句会打印最大长度,不符合预期输出格式。

动态替换硬编码值的实现

你只需要先遍历一次指针数组,统计两个动态参数即可:

  1. 列数:遍历到Al[z] == NULL时停止,累计的z值就是子数组总个数,也就是需要打印的列数。
  2. 最大子数组长度:遍历每个子数组的第一个元素(你约定的长度位),取最大值后减1就是需要打印的行数。

修正后完整可运行代码

#include <stdio.h>
void transpose(int *Al[]){
    int max_len = 0;
    int col_count = 0;
    // 第一次遍历统计参数
    while(Al[col_count] != NULL) {
        int cur_len = *Al[col_count];
        if(cur_len > max_len) {
            max_len = cur_len;
        }
        col_count++;
    }
    int row_count = max_len - 1;
    // 打印转置结果
    for(int k = 1; k <= row_count; k++) {
        for(int i = 0; i < col_count; i++) {
            int *p = Al[i];
            int len = *p;
            if(k < len) {
                printf("%d ", *(p + k));
            } else {
                printf("   ");
            }
        }
        printf("\n");
    }
}

int main() {
    int A[] = {5, -5, 14, 5, 2};
    int B[] = {3, 6, 11};
    int C[] = {4, 1, -3, 4};
    int D[] = {6, 2, 7, 1, 8, 2};
    int E[] = {2, 15};
    int F[] = {3, 4, -2};
    int *All[] = {A, B, C, D, E, F, NULL};
    transpose(All);
    return 0;
}

运行上述代码即可完全匹配你给出的预期输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:15:02