在C中排序char指针数组

时间:2013-08-14 13:15:31

标签: c sorting char

我正在尝试对char指针数组进行排序,为此我使用qsort函数,但我无法理解我做错了什么以及如何对该数组进行排序。

int StringCompare( const void* a, const void* b)
{
    char const *char_a = (char const *)a;
    char const *char_b = (char const *)b;

    return strcmp(char_a, char_b);
}

int main() {
    char *a[] = { "Garima",
          "Amit",
          "Gaurav",
          "Vaibhav"
        };

    int n;

    qsort( a, 4, sizeof(char*), StringCompare);
    for (n=0; n<4; n++)
        printf ("%c ",*a[n]);
}

输出:G A G V

4 个答案:

答案 0 :(得分:3)

问题是传递给sort函数(a.k.a StringCompare)的值是指向a数组的指针。换句话说,它们属于const char **类型。

您需要将char_achar_b声明为const char **,并在调用strcmp时取消引用它们:

int StringCompare( const void* a, const void* b)
{
    char const **char_a = a;
    char const **char_b = b;

    return strcmp(*char_a, *char_b);
}

另请注意,演员阵容是不必要的。

答案 1 :(得分:1)

适当的比较器:

int StringCompare( const void* a, const void* b)
{ 
char const *char_a = *(char const **)a;
char const *char_b = *(char const **)b;

return strcmp(char_a, char_b);
}

注意:

根据排序描述比较器功能是:

compar
Pointer to a function that compares two elements.
This function is called repeatedly by qsort to compare two elements. 
It shall follow the       following prototype:

int compar (const void* p1, const void* p2);

所以,它不会收到char *,而是char **

正确的输出周期:

for (n=0; n<4; n++)
    printf ("%s ", a[n]);

答案 2 :(得分:0)

如果要对第一个字母的char数组进行排序,可以实现一个函数,该函数查看数组中第一个char的(无符号)值。因为它们都等于ASCII标准中的数字。但是如果你将大写字母与小写字母混合,你必须要小心。

我知道......它不是一个特殊的实现函数,但我曾经用这种方式编程并且它有效。

答案 3 :(得分:0)

以这种方式定义StringCompare函数:

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

不需要使用显式转换来混淆代码,因为您可以隐式地将void指针强制转换为任何其他指针类型。