【问题标题】:qsort does nothing with cmpstr [duplicate]qsort 对 cmpstr 不执行任何操作 [重复]
【发布时间】:2018-04-28 03:51:02
【问题描述】:

我不确定为什么 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);
}

【问题讨论】:

  • realloc 是错误的。你应该做realloc(wordlist, (numwords+2)*sizeof(char *));
  • 请提供cmpstr()的代码。这很重要。
  • wordlist[0] 被分配了两次。 wordlist[0] = strdup(words[0]); 和第一个 wordlist[numwords] = strdup(words[i]);。因此失去了第一次分配。
  • 比较函数错误。 ab 指向const char *
  • 不是敲门声,但通常当你说“一个经过良好测试的 C 库函数行为错误”时......这不是应该受到指责的函数。您正在寻找return strcmp (*(char * const *)a, *(char * const *)b);

标签: c sorting qsort


【解决方案1】:

你的比较是错误的:

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

abpointer-to-pointers

或者:

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]);

【讨论】:

  • 当我将其更改为它时,它会给我警告“从不兼容的指针类型初始化[默认启用]”,但它仍然不对数组进行排序
  • @McLovinIt 你注意到赋值运算符后面有一个星号吗?
  • 我得到了它与 @DavidC.Rankin 发布的建议,该建议现已被删除
  • @McLovinIt 我想两者都应该工作。它们本质上是相同的。
  • @iBug 有区别,一个是typequalified,一个是pointer to const,见C11 Standard § (draft n1570),见Note: 29
猜你喜欢
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多