qsort 不工作的 c 程序

qsort not working c program

我正在尝试通过 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 数组

中的条目

首先,您缺少 *:

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;

字面上差不多 "sort by the random locations of these strings in memory," 这对您整理它们根本没有帮助。

正确的做法是不要再添加一颗星(写作 **(char **)a - **(char **)b 字面意思是 "compare the first characters against each other")。正确的做法是调用 strcmp() 来按词法比较两个字符串:

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

这就是你应该使用的。