Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
我正在尝试通过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;


从字面上看,这或多或少是“按内存中这些字符串的随机位置进行排序”,这根本无法帮助您将它们整理好。

正确的做法是不要再添加另一个星号(写**(char **)a - **(char **)b字面意思是“将第一个字符相互比较”)。正确的做法是调用strcmp()以词法比较两个字符串:

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


那就是你应该使用的。

关于c - qsort无法正常工作的c程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43215595/

10-12 20:38