C中的qsort:比较字符串

时间:2013-11-21 05:24:25

标签: 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, *(char * const *) arg2);
}

我不明白为什么手册页的方法有效,因为strcmp的参数是const char * s1和const char * s2。

我对C很新,所以我觉得很难理解这一点。有人可以向我解释为什么只有手册页的方法有效。

2 个答案:

答案 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 **值。