0

我正在尝试对 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]);
}

输出是:GAGV

4

4 回答 4

3

问题是传递给排序函数(aka StringCompare)的值是指向a数组的指针。换句话说,它们是 type const char **

您需要改为声明char_aand char_bas 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);
}

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

于 2013-08-14T13:20:58.260 回答
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]);
于 2013-08-14T13:32:11.997 回答
0

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

我知道......它不是一个特殊的实现功能,但我曾经这样编程它并且它工作。

于 2013-08-14T13:26:26.030 回答
0

以这种方式定义您的 StringCompare 函数:

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

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

于 2013-08-14T13:32:52.590 回答