2017-04-04 59 views
-2

我想通过qsort排序名称数组。qsort不工作c程序

这是我的代码

#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]); 
} 

此代码不会在最后打印出任何东西。它只是结束,因此它看起来像它删除字符数组

+4

打开警告。这个代码中有两个*直接*表示根本问题。 – WhozCraig

+2

在比较函数中需要'strcmp'。比较这些指针最多可以使它们反转或保持不变。 –

+0

'int myCompare(const void * a,const void * b)'接收数组元素的地址。数组元素[应该是](http://stackoverflow.com/a/43215634/2410359)'char *',所以'myCompare()'中的'a'应该转换为'char **'。 – chux

回答

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

这是你应该使用什么。

+0

不是我的DV,而是你自己说的:不是一个答案,而是一个非常好的评论。 –

+0

我回答了他的具体问题:“此代码不打印任何内容。”如果他想知道为什么'qsort()'没有做到他所期望的那样,那完全是另一回事。 (有趣的是,请注意,他并没有真正比较指针,就像您在评论中提到的那样;他按照第一个字符排序,这些字符都是相同的:除非他有足够的幸运在引擎盖下进行稳定排序,否则他的代码可能更随机比即使按指针排序!) –

+0

有没有问题,但标题是关于'qsort',并且您的评论可能已经在您的答案。 –