我试图通过qsort对一组名字进行排序。
这是我的代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int myCompare (const void * a, const void * b ) {
return *(char*)a - *(char*)b;
}
int main(void) {
int i;
char fileArr[] = {"inputbv", "inputa","inputzef",};
int stringLen = sizeof(fileArr) / sizeof(char *);
qsort(fileArr, stringLen, sizeof(char *), myCompare);
for (i=0; i<stringLen; ++i)
printf("%d: %s\n", i, fileArr[i]);
}
此代码最后不会打印任何内容。它只是结束所以它似乎删除了char数组中的条目
答案 0 :(得分:0)
首先,您错过了*
:
char *fileArr[] = {"inputbv", "inputa","inputzef",};
这并不能解释为什么你没有正确排序,这是一个不同的问题,但它 解释了为什么你没有输出。 (验证编译器,如gcc -Wall
,会告诉您,如果没有丢失的星,该声明无效。)
但是,这里还有许多其他问题。首先,正如其中一位评论者提到的那样,myCompare()
函数以正确的类型声明,但它并不完全符合您的想法:
int myCompare(const void *a, const void *b)
{
...
}
那是因为qsort()
将地址传递给每个数据块,而不是数据块本身。在这种情况下,数据块是指向字符数组的指针,因此qsort()
将指向指向比较函数的指针。那些不是单星;他们实际上是伪装的两个明星。
其次,比较指针对你没有好处:几乎按照定义,指针是随机值。您的比较函数,即使您已根据应该存在的*
的数量进行更正,仍然是错误的:
/* Don't do this. */
return *(char **)a - *(char **)b;
这实际上或多或少“按照这些字符串在内存中的随机位置排序”,这对于将它们按顺序排列并没有帮助。
正确的做法是不添加另一个星(写**(char **)a - **(char **)b
字面意思是“将第一个字符相互比较”)。正确的做法是调用strcmp()
来词法地比较两个字符串:
int myCompare(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
这就是你应该使用的。