2D数组:C中的字母排序

时间:2015-11-22 21:26:26

标签: c arrays pointers

char **items

这是我创建数组的方式。 items[0]是第一个字符串,items[1]是第二个字符串等。 我想按字母顺序对这些字符串进行排序,例如:

c.bmp (items[0])
b.bmp (items[1])
a.bmp (items[2])

变为:

a.bmp (items[0])
b.bmp (items[1])
c.bmp (items[2])

但是当我做qsort :(其中i是字符串的数量)

qsort(items, i, (sizeof(char *)), cmp);

它不会按顺序结束。订单会发生变化,但不是按字母顺序排列。

这是我的cmp功能:

int cmp(const void *a, const void *b) { 
    char** p1 = (char**) a;

    char** p2 = (char**) b;

    if( p1[1] > p2[1])
    {
        return -1;
    }
    else if (p1[1] < p2[1])
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

1 个答案:

答案 0 :(得分:4)

你的cmp函数不是比较字符串,只是它们在内存中的位置(更糟糕的是 - 记忆后的事物的位置,即p1[1]而不是p1[0],这也是当数组的最后一个元素参与比较时产生未定义的行为。)

您可以在解除引用传递到代码中的指针后,在strcmp内使用cmp来解决此问题:

int cmp(const void *a, const void *b) {
    char** p1 = (char**) a;
    char** p2 = (char**) b;
    return strcmp(*p1, *p2);
}