C 我的'qsort'程序未按预期工作

C 我的'qsort'程序未按预期工作,c,qsort,C,Qsort,我在使用qsort时遇到了一些问题。我搜索了不同的文档,但不明白为什么我的qsort不起作用 代码如下: char** suffixArray = makeSuffixArray(string, strlen(string)); qsort(*suffixArray, strlen(string) + 1, strlen(string) + 1, (int(*)(const void*, const void*))strcmp); 注: makeSuffixArray生成一个包含单词“香蕉”的

我在使用qsort时遇到了一些问题。我搜索了不同的文档,但不明白为什么我的qsort不起作用

代码如下:

char** suffixArray = makeSuffixArray(string, strlen(string));
qsort(*suffixArray, strlen(string) + 1, strlen(string) + 1, (int(*)(const void*, const void*))strcmp);
注: makeSuffixArray生成一个包含单词“香蕉”的所有可能后缀的数组。 然后Qsort应该按照字典顺序对它们进行排序

函数makeSuffixArray确实有效,我在调试器中反复检查了它

提前谢谢


编辑:想在调试器中发布suffixArray的图片,但没有得到它的声誉:^)。

您没有发布
makeSuffixArray()的代码。
。假设它分配的
char*
数组的长度比字符数多一个,因为包括空后缀,可能的后缀确实比字符多一个

您的代码有3个问题:

  • 将数组的第一个元素传递给
    qsort
    ,而不是指向字符串数组本身的指针
  • 数组元素大小为
    sizeof(*后缀数组)
    。您错误地将
    strlen(string)+1作为第三个参数传递给
    qsort
  • 将strcmp转换为不同的原型是不可移植的。此外,比较函数接收指向数组项的指针,而不是它们的值,因此
    strcmp
    是完全不合适的。您必须定义一个特定的函数,如下所示
以下是修改后的版本:

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

char **suffixArray = makeSuffixArray(string, strlen(string));

qsort(suffixArray, strlen(string) + 1, sizeof(*suffixArray), scmp);

您没有发布
makeSuffixArray()
的代码。假设它分配的
char*
数组的长度比字符数多一个,因为包括空后缀,可能的后缀确实比字符多一个

您的代码有3个问题:

  • 将数组的第一个元素传递给
    qsort
    ,而不是指向字符串数组本身的指针
  • 数组元素大小为
    sizeof(*后缀数组)
    。您错误地将
    strlen(string)+1作为第三个参数传递给
    qsort
  • 将strcmp转换为不同的原型是不可移植的。此外,比较函数接收指向数组项的指针,而不是它们的值,因此
    strcmp
    是完全不合适的。您必须定义一个特定的函数,如下所示
以下是修改后的版本:

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

char **suffixArray = makeSuffixArray(string, strlen(string));

qsort(suffixArray, strlen(string) + 1, sizeof(*suffixArray), scmp);

传递
*suffixArray
可能不是最好的主意
strlen(string)+1,strlen(string)+1
不。
qsort
的第三个参数应该是(留作练习)。@ukasz qsort的第一个参数是数组中元素的地址,不是吗?如果我单独通过后缀数组,qsort会将其转换为垃圾。haccks,如果我没弄错的话,strcmp是用来比较两个字符串的,我觉得它和qsort很好用,有没有见过其他人用它?谢谢各位。可能会有帮助。“如果我单独传递后缀数组,qsort会将其转换为垃圾”。也许这是因为其他一些问题。例如,
strlen(string)+1,strlen(string)+1
。传递
*后缀数组
可能不是最好的主意
strlen(string)+1,strlen(string)+1
不。
qsort
的第三个参数应该是(留作练习)。@ukasz qsort的第一个参数是数组中元素的地址,不是吗?如果我单独通过后缀数组,qsort会将其转换为垃圾。haccks,如果我没弄错的话,strcmp是用来比较两个字符串的,我觉得它和qsort很好用,有没有见过其他人用它?谢谢各位。可能会有帮助。“如果我单独传递后缀数组,qsort会将其转换为垃圾”。也许这是因为其他一些问题。例如,
strlen(string)+1,strlen(string)+1
。它可以工作!我理解它,犯了一些愚蠢的错误,第一次与qsort合作,并没有发现我的错误。谢谢!它起作用了!我理解它,犯了一些愚蠢的错误,第一次与qsort合作,并没有发现我的错误。谢谢!