关于 C 中字符串数组的 qsort
About qsort in C for string array
我正在尝试使用 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
您的数组是指向字符串的指针数组。
由于比较器函数总是获取指向已排序元素开头的指针,这意味着它获取 void*
,其中 指向 char*
那些字符串。
将那些 void*
转换为 char*
显然是一个间接太少了。
我正在尝试使用 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
您的数组是指向字符串的指针数组。
由于比较器函数总是获取指向已排序元素开头的指针,这意味着它获取 void*
,其中 指向 char*
那些字符串。
将那些 void*
转换为 char*
显然是一个间接太少了。