【问题标题】:About qsort in C for string array [duplicate]关于字符串数组的 C 中的 qsort [重复]
【发布时间】:2015-03-23 08:55:39
【问题描述】:

我正在尝试使用 qsort 按字母顺序对字符串数组进行排序。

当我使用comp1 时,它将参数转换为char**,它运行良好。
但如果我使用comp2 则不会,它会转换为char*

为什么?我无法理解comp1comp2 之间的区别。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int comp1(const void *a, const void *b) {
    const char **pa = (const char **)a;
    const char **pb = (const char **)b;
    return strcmp(*pa, *pb);
}
int comp2(const void *a, const void *b) {
    const char *pa = (const char *)a;
    const char *pb = (const char *)b;
    return strcmp(pa, pb);
}
void main(void) {
    char *array[] = {"c","b","a"};
    int size = sizeof(array)/sizeof(char *);
    int i;
    qsort(array,size,sizeof(char *),compX);
    //compX is comp1 or comp2
    for(i=0;i<size;i++){
        printf("%s",array[i]);
    }
}

输出

abc ← 当我使用comp1时

cba ← 当我使用comp2时

【问题讨论】:

  • 顺便说一句,它是int main 并且不需要从void* 到其他一些数据指针类型的显式转换,也不应该在C 中完成。另外,避免将类型传递给@ 987654331@ 而不是表达式,这很容易出错。

标签: c arrays string pointers qsort


【解决方案1】:

您的数组是一个指向字符串的指针数组。
由于比较器函数总是获取指向已排序元素开头的指针,这意味着它会获取void*,其中指向 char* 指向这些字符串。

void* 转换为char* 显然是一种太少的间接方式。

【讨论】:

  • 哦,我明白了!char*的指针是char**。谢谢!
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2013-07-12
  • 2015-03-27
相关资源
最近更新 更多