在c中使用qsort排序

时间:2016-03-17 14:44:15

标签: c sorting qsort

我在c

中有这个代码
const char * array[] = {
    "1",
    "2",
    "helloworld",
    "worldhello",
    "3",
    "zzzzzzzzzz",
    "Zzzzzzzzzz",
    "zzzzzzzzzZ",

};

/* n_array is the number of elements in the array. */

#define n_array sizeof(array)/sizeof(const char *)

/* Compare the strings. */

static int compare (const void * a, const void * b)
{
    /* The pointers point to offsets into "array", so we need to
       dereference them to get at the strings. */

    return strcmp (*(const char **) a, *(const char **) b);
}

int main ()
{
    int i;
    qsort (array, n_array, sizeof (const char *), compare);
    for (i = 0; i < 50000; i++) {
        printf ("%d: %s.\n", i, array[i]);
    }
    return 0;
}

我希望输出变得像这样

helloworld
worldhello
Zzzzzzzzzz
zzzzzzzzzz
zzzzzzzzzZ

我如何修改我的代码以获得输出

2 个答案:

答案 0 :(得分:1)

有两个错误:

a)在compare中大量取消引用指针,实际上要简单得多:

static int compare (const void * a, const void * b) {
    return strcmp (a, b);
}

b)您的输出循环,严重到50000?

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

摆脱&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;是另一种练习。

答案 1 :(得分:0)

As&#39; Z&#39;小于&#39; h,它将被排序为第一个。

您当然可以使用stricmp(或strcmpi),但现在其中包含Z或z的字符串将按任意顺序排序。

然后有字符串&#34; 1&#34;,&#34; 2&#34;,&#34; 3&#34;并且你无法删除它们(实际上你可以,但不能排序)。

所以你的愿望无法实现。