C中的qsort:比较字符串
我有以下问题: qsort中的比较函数如下所示:C中的qsort:比较字符串,c,pointers,qsort,C,Pointers,Qsort,我有以下问题: 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, *(ch
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);
}
这不起作用,因此我在手册页中查找了代码示例,并对其进行了一些更改,因此现在看起来如下所示:
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相当陌生,所以我觉得很难理解这一点。有人能给我解释一下为什么只有手册页的方法有效。
manqsort
说:
数组的内容根据比较函数按升序排序
由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);
}
而manstrcmp
将告诉您它的原型是:
int strcmp(const char *s1, const char *s2);
其中参数是“指向char
”的指针
因此,转换解决了这个问题
您可能需要仔细阅读手册页。
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);
}
而manstrcmp
将告诉您它的原型是:
int strcmp(const char *s1, const char *s2);
其中参数是“指向char
”的指针
因此,转换解决了这个问题
您可能需要仔细阅读手册页。对您的问题的简洁回答是,传递给比较函数的指针不是
char*
,而是char**
如果你仔细想想,如果你对一个整数数组进行排序,你会得到两个
int*
值(伪装成void*
)。如果您对一个double数组进行排序,则会传递两个double*
值;如果对字符串数组进行排序,则会向字符串传递两个指针,这意味着两个char**
值。对您的问题的简洁回答是,传递给比较函数的指针不是char*
,而是char**
如果你仔细想想,如果你对一个整数数组进行排序,你会得到两个
int*
值(伪装成void*
)。如果您对一个double数组进行排序,则会传递两个double*
值;如果对字符串数组进行排序,将向您传递两个指向字符串的指针,这意味着两个char**
值。请查找重复项-已经回答了许多类似的问题。选项包括(不按功绩排序):、。我肯定还有其他人。尝试使用SO搜索框中的[c]qsort string
进行搜索。请查找重复项-已经回答了许多类似的问题。选项包括(不按功绩排序):、。我肯定还有其他人。尝试使用SO搜索框中的[c]qsort字符串进行搜索。非常简洁和精确。非常简洁和精确。