You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:30:10