C中的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

我有以下问题: 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);
}
这不起作用,因此我在手册页中查找了代码示例,并对其进行了一些更改,因此现在看起来如下所示:

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字符串进行搜索。非常简洁和精确。非常简洁和精确。