qsort不工作c程序

时间:2017-04-04 19:04:04

标签: c qsort

我试图通过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数组中的条目

1 个答案:

答案 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);
}

这就是你应该使用的。