2013-11-28 27 views
0

我在排序C中的qsort() char字符串时遇到问题。 我想按字符串的长度对数组进行排序。如何通过q​​sort对C中char字符的3D数组进行排序

我发现这个代码进行排序二维数组:

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] = { 
    { "murderer", "termination specialist" }, 
    { "failure", "non-traditional success" }, 
    { "specialist", "person with certified level of knowledge" }, 
    { "incorrect answer", "alternative answer" } 
    }; 

为此格式:

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

什么不行?编译错误...逻辑错误... –

+5

显示你的数组是如何定义的,并通过排序3D数组来确切解释你的意思。排序只在一个维度上有意义。有了多个维度,您需要额外的条件。 – paddy

回答

0

不知道你想向大家介绍的排序规则,我可以看到的C指针问题在您的实现。如果成功地用于2D情况下,代码:

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

我的猜测是,铸造为3D的情况下是不正确的:

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

,因为这应该是

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

因为在3D的情况下你需要两次取消引用指针。

-1
#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; 
} 
+0

-1,因为它不是一个答案 - 它只是一些代码示例的副本粘贴(相关,但无论如何,应该至少有最少的解释) – pmod

+0

@pmod只需展示实际工作的代码就足够了。 – BLUEPIXY

+0

该代码清楚地显示了指向'char * Row [2]'的指针,它通过什么qsort来比较它。 – BLUEPIXY

相关问题