我有以下问题: 我在qsort中的比较函数如下所示:
static int compare(const void *arg1, const void *arg2) {
return strcmp((const char *) arg1, (const char *) arg2);
}
这不起作用,所以我查看了手册页中的代码示例,我稍微改了一下,所以现在它看起来像这样:
static int compare(const void *arg1, const void *arg2) {
return strcmp( *(char * const *) arg1, *(char * const *) arg2);
}
我不明白为什么手册页的方法有效,因为strcmp的参数是const char * s1和const char * s2。
我对C很新,所以我觉得很难理解这一点。有人可以向我解释为什么只有手册页的方法有效。
答案 0 :(得分:3)
man qsort
说:
根据比较函数,数组的内容按升序排序
compar
指向的,用两个参数调用,指向被比较的对象。
很明显“有两个参数指向要比较的对象”。因此,在比较两个char *
字符串时,参数的类型为“指向char
的指针”,这也在联机帮助页中有所介绍:
static int
cmpstringp(const void *p1, const void *p2)
{
/* The actual arguments to this function are "pointers to
pointers to char", but strcmp(3) arguments are "pointers
to char", hence the following cast plus dereference */
return strcmp(* (char * const *) p1, * (char * const *) p2);
}
man strcmp
会告诉你它的原型是:
int strcmp(const char *s1, const char *s2);
其中参数是“指向char
的指针”。
因此转换解决了这个问题。
您可能需要仔细阅读联机帮助页。
答案 1 :(得分:3)
对您的问题的简洁回答是,传递给比较函数的指针不是char *
而是char **
。
如果您考虑一下,如果您要对整数数组进行排序,则会传递两个int *
值(伪装成void *
)。如果要对双精度数组进行排序,则会传递两个double *
值;如果要对字符串数组进行排序,则会传递两个指向字符串的指针,这意味着两个char **
值。