c - qsort 对 cmpstr 没有任何作用

标签 c sorting qsort

<分区>

我不确定为什么 qsort 不更改我的数组,因为元素不是按字母顺序排列的。谁能帮我弄清楚我做错了什么。

char **wordlist = malloc(sizeof(char*));
int i, numwords = 0;
wordlist[0] = strdup(words[0]);

for(i = 0; i < wcount; i++)
{
    wordlist = realloc(wordlist, (numwords+1)*sizeof(char *));
    wordlist[numwords] = strdup(words[i]);
    numwords++;
}

printf("Added %d words to the array and they are:\n", numwords);
for(i = 0; i < numwords; i++)
{
    printf("%s\n", wordlist[i]);
}

qsort(wordlist, numwords, sizeof(char *), cmpstr);

for(i = 0; i < numwords; i++)
{
    printf("%s\n", wordlist[i]);
}

int cmpstr(const void* a, const void* b)
{
   const char* aa = (const char*)a;
   const char* bb = (const char*)b;
   return strcmp(aa, bb);
}

最佳答案

你的比较是错误的:

int cmpstr(const void* a, const void* b) {
    char *aa = * (char * const *)a;
    char *bb = * (char * const *)b;
//             ^
//       asterisk here!
//
    return strcmp(aa, bb);
}

ab指针到指针

或者:

int cmpstr(const void* a, const void* b) {
    char * const * aa = a;
    char * const * bb = b;
    return strcmp(*aa, *bb);
}

此外,还存在潜在的内存泄漏,因为您没有free() strdup() 提供的内容。您应该删除给定代码中的第 3 行:

wordlist[0] = strdup(words[0]);

关于c - qsort 对 cmpstr 没有任何作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47298638/

相关文章:

在c中将signed char转换为int

c - 访问已分配内存中的变量

c - C中的按位运算伪造文件内容

algorithm - 如何将排序列表合并为 O(n * log(k)) 中的单个列表

C - qsort 将错误的指针发送到比较器函数?

c - 如何根据某个字段找到BST中的某个节点并打印这些节点的完整属性?

C++ 提供了 std::sort,但它是否也提供了高效搜索的功能?

python - 对包含元组的元组进行排序

C qsort 无法正常工作

对指向字符串的指针数组进行排序时崩溃