【问题标题】:qsort not working c program [closed]qsort不工作的c程序[关闭]
【发布时间】:2017-04-04 19:04:03
【问题描述】:

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

【问题讨论】:

  • 打开你的警告。这段代码发出了两个直接指示根本问题的代码。
  • 比较功能需要strcmp。比较指针最多只能颠倒它们或保持它们不变。
  • int myCompare (const void * a, const void * b ) 接收数组元素的地址。数组元素should bechar *,所以myCompare() 中的a 应该转换为char **

标签: c qsort


【解决方案1】:

首先,您缺少*

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

这就是你应该使用的。

【讨论】:

  • 不是我的 DV,而是你自己说的:不是答案,而是非常好的评论。
  • 我回答了他的具体问题:“此代码不打印任何内容。”如果他想知道为什么qsort() 没有做他期望的事情,那完全是另外一回事。 (有趣的是,请注意,正如您在评论中提到的那样,他实际上并没有比较指针;他按第一个字符进行排序,这些字符都是相同的:除非他有幸在后台进行了稳定的排序,否则他的代码可能更随机甚至比按指针排序!)
  • 没有问题,但标题是关于qsort的,你的评论可能已经在你的答案中了。
  • 嗯,是的,没有以“?”结尾的句子但他最后谈到的似乎是“为什么我没有得到任何输出”,所以我对他真正问的是什么做了一个最好的猜测。 耸耸肩你赢了一些,你也输了一些。
  • 那么为什么不改进你的答案呢?
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多