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

C语言新手求助:qsort实现指针数组单词去重排序出错排查

问题分析与解决方法
  • 你的比较函数完全错配了数据类型
    你要排序的是char**类型的指针数组,但你的intcmp把传入的void*强制转换成了const int*,这完全不对。qsort传给比较函数的a和b,是指向数组中单个元素的指针——也就是char**类型(因为数组元素是char*)。你现在把它们当成int*去解引用,要么会读取到错误的内存值导致排序混乱,要么直接触发内存访问错误。

  • 正确的字符串比较函数写法
    要排序字符串数组,得用strcmp来比较字符串内容,同时要正确转换指针类型:

    static int strcmp_wrapper(const void *a, const void *b) {
        // a和b是指向char*的指针,先解引用拿到字符串指针
        const char *left = *(const char **)a;
        const char *right = *(const char **)b;
        // 用strcmp比较,返回值符合qsort的要求
        return strcmp(left, right);
    }
    
  • 调用qsort的注意事项
    调用qsort时,第三个参数(单个元素的大小)要传sizeof(char*),因为你的数组每个元素是字符串指针:

    qsort(allwords, word_count, sizeof(char*), strcmp_wrapper);
    

    (这里word_count是你数组中有效单词的数量)

  • 关于“唯一排序”
    qsort本身只会排序不会去重,要实现唯一排序,得在排序之后手动去重:遍历排序后的数组,把重复的元素移除或者标记跳过。比如可以这样做:

    int unique_count = 0;
    for (int i = 0; i < word_count; i++) {
        if (i == 0 || strcmp(allwords[i], allwords[i-1]) != 0) {
            allwords[unique_count++] = allwords[i];
        }
    }
    // 之后unique_count就是去重后的元素数量,allwords前unique_count个是唯一的单词
    

内容的提问来源于stack exchange,提问作者Dakota Kellogg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:01:12