如何在C语言中正确排序字符串数组?现有代码存在问题
二维字符数组的正确排序方法
原代码无法正常运行,主要存在三个问题:
- 缺少必要的头文件:使用
strcpy、strcmp、qsort等函数需要包含<string.h>、<stdlib.h>头文件,否则会触发编译错误; qsort的元素大小参数错误:原代码用sizeof(char*)作为单个元素的大小,但d是char[5][10]类型的二维数组,每个元素是长度为10的字符数组,正确的单个元素大小应为sizeof(d[0])(等价于sizeof(char[10]));- 比较函数的指针转换未保留
const修饰符:从const void*转换为字符串指针时未添加const限定,可能导致未定义行为。
修正后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int my_compare(const void* a, const void* b) { // 将指向二维数组元素的指针转换为const char*字符串指针 const char* str1 = (const char*)a; const char* str2 = (const char*)b; // strcmp返回值直接作为排序依据:小于0则str1在前,大于0则str2在前 return strcmp(str1, str2); } int main() { char d[5][10]; strcpy(d[0], "123456789"); strcpy(d[1], "1"); strcpy(d[2], "7"); strcpy(d[3], "200000"); strcpy(d[4], "300400000"); // 修正qsort的元素大小参数 qsort(d, 5, sizeof(d[0]), my_compare); // 输出排序结果验证 for (int i = 0; i < 5; i++) { printf("%s\n", d[i]); } return 0; }
关键细节说明
qsort参数的正确使用:- 第一个参数是待排序数组的起始地址,
d作为二维数组名会自动退化为指向第一个元素(d[0])的指针; - 第二个参数是数组的元素总数,这里为5;
- 第三个参数是单个元素的字节数,用
sizeof(d[0])可以动态获取二维数组单个元素的大小,避免硬编码; - 第四个参数是自定义比较函数,
qsort会通过该函数判断元素的先后顺序。
- 第一个参数是待排序数组的起始地址,
- 比较函数的逻辑:
strcmp函数按ASCII码顺序比较两个字符串:返回值小于0时str1排在前面,等于0时两字符串相等,大于0时str2排在前面。
内容的提问来源于stack exchange,提问作者Danijel
相关产品推荐
相关产品推荐

