qsort没有对字符串数组进行排序

时间:2013-02-21 01:50:39

标签: c

我尝试使用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);

但是,当我打印数组时,没有任何改变。这有什么不对吗?

3 个答案:

答案 0 :(得分:8)

我已将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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

使用以下命令开始调试:

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

我想不久之后,你会发现问题所在。 :)