【问题标题】:qsort in C: compare Strings [duplicate]C中的qsort:比较字符串[重复]
【发布时间】:2013-11-21 05:24:24
【问题描述】:

我有以下问题: 我在 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 很陌生,所以我很难理解这一点。有人可以向我解释一下为什么只有手册页的方法有效。

【问题讨论】:

  • 请查找重复项——已经回答了许多类似的问题。选项包括(不分先后):SO 14993282SO 5035289SO 18400333SO 19558447。我敢肯定还有其他人。尝试在 SO 搜索框中使用 [c] qsort string 进行搜索。

标签: c pointers qsort


【解决方案1】:

您的问题的简洁答案是传递给比较函数的指针不是char *,而是char **

如果你考虑一下,如果你对一个整数数组进行排序,你会得到两个int * 值(伪装成void *)。如果您正在对一个双精度数组进行排序,您将获得两个 double * 值;如果要对字符串数组进行排序,则会传递两个指向字符串的指针,这意味着两个 char ** 值。

【讨论】:

  • 确实简洁准确。
【解决方案2】:

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 的指针”。

因此转换解决了这个问题。

您可能需要仔细阅读手册页。

【讨论】:

    猜你喜欢
    • 2019-07-01
    • 2012-09-09
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2019-06-19
    相关资源
    最近更新 更多