我正在尝试对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
答案 0 :(得分:3)
问题是传递给sort函数(a.k.a StringCompare
)的值是指向a
数组的指针。换句话说,它们属于const char **
类型。
您需要将char_a
和char_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指针强制转换为任何其他指针类型。