[英]Why this qsort() doesn't work?
正在对字符串数组进行排序(不区分大小写)。
qsort导致分段错误,可能是我的转换不正确。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *string1, const void *string2) {
char *a = (char*)(string1);
char *b = (char*)(string2);
printf("comparing %s AND %s\n", a, b);
return strcasecmp(a,b);
}
void sortListName(char **fileList, int noOfFiles) {
printf("Sorting\n");
qsort(fileList, noOfFiles, 260*sizeof(char), compare);
return;
}
** fileList =字符串数组(文件名)
PS main()很明显并且可以正常工作。
如果这是与qsort
相关的所有代码,则好像已声明了comparePtr
函数指针,但仍未初始化。 它没有指向您的compare
功能(这是我想您要它指向的功能)。
在那之后,还有几件事:
1) comparePtr
具有正确的类型,但compare
没有。 它需要接受两个const void*
,但是您有两个const void**
。
2)修复类型后,您可以将compare
传递给qsort
,而不是创建函数指针并将其传递。
3)我不相信qsort
的第一个参数是正确的。 您想要传递指向数组中第一个元素的指针,该指针应该只是fileList
(我假设它指向数组中的第一个字符串)。
4)第三个参数也不正确。 fileList
是一个char**
,这意味着您要传入一个char *
s数组,因此第三个参数应该只是sizeof(char*)
,而不是字符串的strlen
。
我会进行调整,以便您只对一个简单的数组进行排序,在这种情况下,指向char的指针qsort
将安排您获取指向该数组中两个元素的指针(即char **
指针),以及一些基本的需要取消引用才能使您到达可通过strcasecmp
比较的“ char指针”。 @Mark可能已经在您看不见的调用代码中怀疑了260的来源,但是我不是C语言中那种2d数组的忠实拥护者。
以下函数对我有用,并带有一个示例main()来执行它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void *v1, const void *v2){
char *a = *(char **)v1;
char *b = *(char **)v2;
printf("comparing %s to %s\n", a, b);
return strcasecmp(a,b);
}
void sortListName(char **fileList, int noOfFiles){
printf("Sorting\n");
qsort(fileList, noOfFiles, sizeof(*fileList), compare);
return;
}
int
main(void)
{
char *filenames[] = {
"/var/www/icons/comp.gray.png",
"/var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var",
"/var/www/icons/right.gif",
"/var/www/error/HTTP_NOT_IMPLEMENTED.html.var",
"/var/www/icons/pie3.png",
"/var/www/icons/pie2.png",
"/var/www/htdocs/manual/mod/mod_proxy_balancer.html",
"/var/www/htdocs/manual/programs/rotatelogs.html",
"/var/www/htdocs/manual/vhosts/mass.html",
"/var/www/icons/movie.png",
"/var/www/htdocs/manual/images/caching_fig1.png",
"/var/www/htdocs/htdig/search.html",
"/var/www/icons/generic.gif",
"/var/www/htdocs/manual/mod/quickreference.html",
"/var/www/icons/small/blank.png",
"/var/www/icons/image2.gif"
};
int i, nf = (int) (sizeof(filenames) / sizeof(filenames[0]));
puts("Unsorted:");
for (i = 0; i < nf; i++) {
puts(filenames[i]);
}
sortListName(filenames, nf);
puts("Sorted:");
for (i = 0; i < nf; i++) {
puts(filenames[i]);
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.