C语言中对等长字符数组列表执行qsort排序的问题
修正qsort的compare函数问题
看起来你的compare函数写了一半就中断了,不过从上下文和代码片段来看,你应该是要为qsort实现一个针对char**类型数组的比较函数对吧?我来帮你修正并解释清楚细节。
正确的compare函数实现
首先补全并修正你的函数,这是能直接用于qsort的版本:
int compare(const void *a, const void *b) { // 将void指针转换为指向char*的指针(你的数组元素是char*,所以元素地址是char**) const char **fpa = (const char**)a; const char **fpb = (const char**)b; // 用strcmp比较两个字符串,返回值正好匹配qsort的要求 return strcmp(*fpa, *fpb); }
为什么这么写?
- qsort的工作机制是:把数组中每个元素的地址传递给compare函数。你的数组是
char**类型,每个元素是char*(字符串指针),所以元素的地址就是char**类型,因此需要把void*参数转换成const char**。 - 解引用
fpa和fpb就能拿到要比较的两个字符串(char*),strcmp的返回值完全符合qsort的要求:- 返回负数:第一个字符串字典序小于第二个
- 返回0:两个字符串相等
- 返回正数:第一个字符串字典序大于第二个
关键注意事项
- 保证字符串以'\0'结尾:你给每个
list[i]分配了33个char的空间,但一定要确保每个字符串都以终止符'\0'结尾,否则strcmp会读取超出分配的内存,触发未定义行为。比如用snprintf写入字符串时,它会自动添加'\0';如果手动赋值,记得最后要加list[i][32] = '\0';(因为33个元素的下标是0-32)。 - 逆序排序需求:如果需要按字典序从大到小排列,只需要把返回值取反即可:
return -strcmp(*fpa, *fpb); - 处理空指针情况:如果你的数组可能存在
NULL(比如malloc分配失败),一定要在compare函数中先判断,避免解引用空指针崩溃:int compare(const void *a, const void *b) { const char **fpa = (const char**)a; const char **fpb = (const char**)b; // 自定义空指针的排序规则,这里把NULL排在最前面 if (*fpa == NULL && *fpb == NULL) return 0; if (*fpa == NULL) return -1; if (*fpb == NULL) return 1; return strcmp(*fpa, *fpb); } - 内存释放:排序完成后,不要忘记正确释放内存:
for (int i = 0; i < LIST_SIZE; i++) { free(list[i]); } free(list);
内容的提问来源于stack exchange,提问作者John_D
相关产品推荐
相关产品推荐

