2013-11-28 47 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

相關問題