【问题标题】:qsort did not sort the array of string [duplicate]qsort 没有对字符串数组进行排序[重复]
【发布时间】:2013-02-06 05:55:46
【问题描述】:

我尝试使用 qsort 对字符串数组进行排序。这是我的数组的内容:

{"a","orange","apple","mobile","car"}

这就是我使用 qsort 的方式:

int myCompare (const void * a, const void * b ) {
  const char *pa = (const char*)a;
  const char *pb = (const char*)b;
  return strcmp(pa,pb);
}

int stringLen = sizeof(input)/sizeof(char *);
qsort(input, stringLen, sizeof (char*), myCompare);

但是,当我打印数组时,什么都没有改变。这个有什么问题吗?

【问题讨论】:

  • 输入声明为什么?
  • char *input = (char **)malloc((size+1)*sizeof(char));
  • 你的问题!
  • 指向char的指针数组,与相同大小的char的连续内存块不同。
  • 最后一次尝试:请发布所有相关的实际代码。

标签: c


【解决方案1】:

我已将您的 myCompare 函数更改为 Mitch Wheat 之前发布的函数,并且可以正常工作。示例如下:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int myCompare (const void * a, const void * b ) {
    const char *pa = *(const char**)a;
    const char *pb = *(const char**)b;

    return strcmp(pa,pb);
}

int main() {
    int i;
    const char *input[] = {"a","orange","apple","mobile","car"};

    int stringLen = sizeof(input) / sizeof(char *);
    qsort(input, stringLen, sizeof(char *), myCompare);

    for (i=0; i<stringLen; ++i)
        printf("%d: %s\n", i, input[i]);
}

这将返回:

0: a
1: apple
2: car
3: mobile
4: orange

【讨论】:

  • 我只是复制粘贴你的代码,但它不起作用 T.T 编译器可能有问题吗?
  • 没有。正如我前段时间所说:这就是您声明“数组”的方式。编译器没有损坏!达到了收益递减点....
  • @MitchWheat 但根据 sharth 它可以正常工作
  • 这里也可以正常工作:ideone.com/UqvehY
  • 要在强制转换之间保持 const 限定符,这些行必须稍作改动: const char * pa = *(const char * const * ) a; const char * pb = *(const char * const * ) b;
【解决方案2】:

qsort(input, stringLen, sizeof (char*), myCompare) 调用myCompare 来比较已排序的字符串。

myCompare 获取指向比较值的指针。在我们的例子中,我们得到指向字符串的指针 (const char**)。所以我们应该比较*(const char**)a*(const char**)b,它们是ab指向的字符串。

【讨论】:

    【解决方案3】:

    开始调试:

    int myCompare (const void * a, const void * b ) {
      const char *pa = (const char*)a;
      const char *pb = (const char*)b;
    
      printf("Comparing %s vs. %s for result %d\n", pa, pb, strcmp(pa,pb));
    
      return strcmp(pa,pb);
    }
    

    我认为不久之后,您就会发现问题所在。 :)

    【讨论】:

    • 没有错。它为每个 a 和 b 返回一个正确的值
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2011-07-19
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多