gpt4 book ai didi

c - 将数组传递给 "qsort"是如何工作的?

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:00 25 4
gpt4 key购买 nike

所以我在下面声明了 main 函数,用户必须在第一次执行程序时从命令行向其传递参数。然后,它采用 *argv[] 字符串输入数组并使用 stdlib.h 的 qsort 函数对它们进行排序,之后它最终打印出所有元素,除了输入数组中的文件名;

int main(int argc,char *argv[]){                                                                                                                                                                                                
qsort(argv,args,sizeof(*argv),comp_func);
for(int U=1;U<argc;U++)printf("%s\n",argv[U]);
}

传递给qsortcomp_func函数如下所示:

int comp_func(char*a,char*b){
return strcmp(*(char **)a,*(char **)b);
}

我想知道的是这里发生了什么?我很高兴 qsort 将数组的每个 2 长度排列发送到给定的比较器函数,在这种情况下,这两个都是字符串,因为 argv 是一个数组字符串。但是,我不明白这里发生了什么:

strcmp(*(char **)a,*(char **)b)

*(char **)a 在做什么?它只是创建一个任意的 char[] 指针数组,该指针指向长度为 1 的任意字符串,然后将其第一个值分配给 a,然后是最终取消引用,最终返回字符串 a?如果是这样,那为什么普通的 a 不起作用?另外,有趣的是,如果我 printf 只是普通的 a,它会输出一串随机字符,类似于 ??O_?。但是,当我改为 printf *(char **)a 时,我得到了实际的字符串输入。这是为什么?我是 C 的初学者,所以如果我有任何问题,请多多包涵。

最佳答案

qsort() 需要一个连续的对象数组作为第一个参数 base。现在,argv 是一个 const char * 指针数组,所以

qsort(argv, args, sizeof(*argv), comp_func);

表示,对指针数组进行排序,其中 sizeof(*argv)const char * 的大小。

传递给 comp_func() 的是两个对象从基指针偏移的地址,即 argv 中 char 指针的地址。要返回包含参数字符串的实际字符串数组/指针,我们需要取消引用它。也就是说,参数字符串实际上位于 *a*b

签名仍然完全错误,应该会到处抛出编译器警告。 comp_func() 实际上需要两个 const void *:

int
comp_func(const void *a,const void *b) {
return strcmp(*(const char **)a,*(const char **)b);
}

强制转换是必要的,因为 *a 不是具有 const void * 的有效类型并且 strcmp() 需要 const char *,也是。

关于c - 将数组传递给 "qsort"是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38784890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com