如何用qsort对C中的3D字符数组进行排序

如何用qsort对C中的3D字符数组进行排序,c,arrays,sorting,qsort,multidimensional-array,C,Arrays,Sorting,Qsort,Multidimensional Array,我在C中使用qsort()对3D字符数组进行排序时遇到问题。 我想按字符串的长度对数组排序 我找到了用于排序2D数组的以下代码: int compare(const void *name1, const void *name2) { const char *name1_ = *(const char **)name1; const char *name2_ = *(const char **)name2; return strcmp(name1_, name2_); }

我在C中使用
qsort()
对3D字符数组进行排序时遇到问题。 我想按字符串的长度对数组排序

我找到了用于排序2D数组的以下代码:

int compare(const void *name1, const void *name2)
{
    const char *name1_ = *(const char **)name1;
    const char *name2_ = *(const char **)name2;

    return strcmp(name1_, name2_);
}
我将代码修改为:

int compare(const void *name1, const void *name2)
{    

    const char *name1_ = *(const char ***)name1;
    const char *name2_ = *(const char ***)name2;

    if(strlen(name1_)>strlen(name2_))
    {
      return 1;
    }

    if(strlen(name1_)<strlen(name2_))
    {
      return -1;
    }
    else
    {
      return 0;
    }
}
对于此格式:

char * array1 [][2] = {
         { "incorrect answer", "alternative answer" }, 
         { "specialist", "person with certified level of knowledge" },
         { "murderer", "termination specialist" },
         { "failure", "non-traditional success" }
        };

在不知道您要引入的排序规则的情况下,我可以看到您的实现中存在C指针问题。如果代码成功用于2D案例:

const char name1_ = *(const char **)name1;
我猜3D case的铸造是不正确的:

const char name1_ = *(const char ***)name1;
因为这应该是

const char name1_ = **(const char ***)name1;
因为在3D情况下,您需要两次取消对指针的引用

#包括
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char *Row[2];

int compare(const void *row1, const void *row2){
    const Row *name1 = (const Row*)row1;
    const Row *name2 = (const Row*)row2;
    return strlen((*name2)[0]) - strlen((*name1)[0]);
}
/* or
int compare(const void *row1, const void *row2){
    const char *name1 = *(const char**)row1;
    const char *name2 = *(const char**)row2;
    return strlen(name2) - strlen(name1);
}
*/

int main(){
    char * array1 [][2] = {
        { "murderer", "termination specialist" },
        { "failure", "non-traditional success" },
        { "specialist", "person with certified level of knowledge" },
        { "incorrect answer", "alternative answer" }
    };
    qsort(array1, sizeof(array1)/sizeof(*array1), sizeof(*array1), compare);
    {//check 
        int i;
        for(i=0;i<4;++i)
            printf("\"%s\", \"%s\"\n", array1[i][0], array1[i][1]);
    }
    return 0;
}
#包括 #包括 typedef char*行[2]; 整数比较(常量无效*第1行,常量无效*第2行){ 常量行*名称1=(常量行*)行1; 常量行*名称2=(常量行*)行2; 返回strlen((*name2)[0])-strlen((*name1)[0]); } /*或 整数比较(常量无效*第1行,常量无效*第2行){ 常量字符*名称1=*(常量字符**)行1; 常量字符*名称2=*(常量字符**)行2; 返回strlen(name2)-strlen(name1); } */ int main(){ 字符*数组1[][2]={ {“杀人犯”、“解雇专家”}, {“失败”,“非传统成功”}, {“专家”、“具有认证知识水平的人员”}, {“错误答案”、“备选答案”} }; qsort(array1,sizeof(array1)/sizeof(*array1),sizeof(*array1),比较); {//检查 int i;
对于(i=0;i什么不起作用?编译错误…逻辑错误…显示数组是如何定义的,并准确解释排序3D数组的含义。排序仅在一个维度上有意义。对于多个维度,您需要附加条件。-1因为它不是答案-它只是一些代码示例的复制粘贴(相关,但无论如何,至少应该有最低限度的解释)@pmod仅显示实际工作的代码就足够了。此代码清楚地显示了指向
char*Row[2]
qsort传递的比较结果。“仅显示实际工作的代码就足够了。”抱歉,但这是我不能同意的。这鼓励了误用-人们在这里发布损坏的代码并拿走修复的代码。这不是这样做背后的想法。人们应该学会如何编程和使用工具…@pmod这是不同的观点。实际显示的代码是最明显的表现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char *Row[2];

int compare(const void *row1, const void *row2){
    const Row *name1 = (const Row*)row1;
    const Row *name2 = (const Row*)row2;
    return strlen((*name2)[0]) - strlen((*name1)[0]);
}
/* or
int compare(const void *row1, const void *row2){
    const char *name1 = *(const char**)row1;
    const char *name2 = *(const char**)row2;
    return strlen(name2) - strlen(name1);
}
*/

int main(){
    char * array1 [][2] = {
        { "murderer", "termination specialist" },
        { "failure", "non-traditional success" },
        { "specialist", "person with certified level of knowledge" },
        { "incorrect answer", "alternative answer" }
    };
    qsort(array1, sizeof(array1)/sizeof(*array1), sizeof(*array1), compare);
    {//check 
        int i;
        for(i=0;i<4;++i)
            printf("\"%s\", \"%s\"\n", array1[i][0], array1[i][1]);
    }
    return 0;
}