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
相关产品推荐
相关产品推荐

