使用qsort对二维字符数组排序疑难问题调试及解决过程

本文记录了在使用C语言的qsort函数对二维字符数组进行排序时遇到的问题及其解决过程,详细探讨了存储、输出和算法实现等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

先说说我这个程序的场景。我程序中有一个二维数组,代码段如下:
char files[101][64];   // files[i][0] sotres the length of the i-the file name
正如注释中说的, files[i ][0] 用来存储 files[i ] 这个字符串的长度,字符串是从 files[i ][1] 开始存储的,每个字符串长度保证不超过 60, 所以才考虑这样来存储。现在突然发现在字符串都存储到 files 中去后,必须还要对 files 中的字符串进行排序。如果是使用 c++ string 来写当然没问题,但是既然代码已经写成这样,就没再重写,而是打算用 C qsort 来排序,这也是一个很有挑战性的工作。
对于自己的代码,先后尝试了很多办法也没能让它正确工作,最终想到调试 MSDN 上给出的那个使用 qsort 对字符串进行排序的程序。那个程序如下:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
int compare( const void *arg1, const void *arg2 );
 
void main( int argc, char **argv )
{
   int i;
### 使用 `qsort` 对二维数组进行排序 在 C 语言中,`qsort` 函数可以用于对一维数组、结构体数组以及二维数组等数据结构进行排序。对于二维数组排序,需要明确按照何种规则进行排序(例如按行排序、按列排序或按特定元素值排序)。以下是一个完整的示例,展示如何使用 `qsort` 对二维数组进行排序。 #### 示例代码:按二维数组的第一列元素升序排序 ```c #include <stdio.h> #include <stdlib.h> #define ROW 5 #define COL 3 // 定义比较函数,按二维数组第一列元素升序排序 int compare(const void *a, const void *b) { // 将二维数组的行指针转换为 int 指针 int *row1 = (*(int **)a); int *row2 = (*(int **)b); // 比较两行的第一列元素 if (row1[0] > row2[0]) { return 1; } else if (row1[0] < row2[0]) { return -1; } else { return 0; } } int main(void) { // 定义二维数组 int array[ROW][COL] = { {3, 2, 5}, {1, 9, 4}, {7, 8, 6}, {0, 1, 2}, {4, 3, 7} }; // 动态分配一个指针数组,指向二维数组的每一行 int *ptr[ROW]; for (int i = 0; i < ROW; i++) { ptr[i] = array[i]; } // 使用 qsort二维数组进行排序 qsort(ptr, ROW, sizeof(int *), compare); // 输出排序后的二维数组 printf("Sorted 2D Array:\n"); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { printf("%d ", ptr[i][j]); } printf("\n"); } return 0; } ``` #### 代码解析 1. **定义二维数组**:通过宏定义 `ROW` 和 `COL`,方便调整数组大小。 2. **动态指针数组**:创建一个指针数组 `ptr`,指向二维数组的每一行[^4]。 3. **比较函数**:`compare` 函数接收两个 `void*` 类型参数,并将其转换为指向二维数组行的指针。通过比较第一列元素实现升序排序。 4. **调用 `qsort`**:将指针数组传递给 `qsort` 函数,完成排序操作。 5. **输出结果**:遍历排序后的二维数组并打印。 #### 注意事项 - 如果需要按其他列排序,只需修改比较函数中的索引值即可。例如,按第二列排序时,将 `row1[0]` 和 `row2[0]` 替换为 `row1[1]` 和 `row2[1]`。 - 若需降序排序,可调整比较函数的返回值逻辑,将 `1` 和 `-1` 的位置互换[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值