c - 关于C中字符串数组的qsort

标签 c arrays string pointers qsort

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

当我使用comp1时,它将参数转换为 char** ,效果很好。
但如果我使用 comp2 则不会,转换为 char*相反。

为什么?我无法理解 comp1 之间的区别和comp2 .

#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时

最佳答案

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

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

关于c - 关于C中字符串数组的qsort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28124810/

相关文章:

c - 不使用时删除posix共享内存?

c++ - 如何在 Linux 上使用带有 EG20T 芯片组的英特尔凌动 Q7 模块上的 CAN 总线?

c - C 中的内联汇编 : Dynamic registers

arrays - 公式元素的t ="array"是什么意思

将 uint8_t 转换为 ascii 字符串 C

javascript - 带有 localStorage 的数组不保存或被覆盖?

c - 从文件中读取每一行并将该行拆分为字符串和 C 中的数组

python - 将字符串转换为 numpy 数组

android - 以字符串形式读取文件

c - 返回函数(c)中的子字符串