C语言基于指针实现多变长数组转置打印 求解动态边界方案
问题原因&解决方案
第一版代码无输出的问题
- 终止条件逻辑错误:你的指针数组
All末尾以NULL作为哨兵,但是第一版代码中判断*Al[z] != "\0",不仅错误对可能为NULL的指针进行解引用,还将int类型的值与字符串常量做比较,类型完全不匹配,直接导致程序运行异常无输出。 - 循环边界写反:外层循环应该控制行数(最大子数组长度-1),内层控制列数(子数组个数),第一版的边界逻辑完全颠倒。
- 多余的
printf("%d ",x);语句会打印最大长度,不符合预期输出格式。
动态替换硬编码值的实现
你只需要先遍历一次指针数组,统计两个动态参数即可:
- 列数:遍历到
Al[z] == NULL时停止,累计的z值就是子数组总个数,也就是需要打印的列数。 - 最大子数组长度:遍历每个子数组的第一个元素(你约定的长度位),取最大值后减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
相关产品推荐
相关产品推荐

