2015-05-11 46 views
1

我想排序一個簡化版本的字符串的二維數組看起來像 (我不想改變「nameArray」的數據類型爲「char * nameArray [4] 「)使用qsort排序一個二維數組segd fault

#include <sys/types.h> 
#include <stdio.h> 

int cstring_cmp(const void *a, const void *b) 
{ 
    const char **ia = (const char **)a; 
    const char **ib = (const char **)b; 
    return strcasecmp(*ia, *ib); 
} 

int Test() 
{ 
    char nameArray[4][10]={"test","alpha","Hyper","city"}; 
// int nElem = sizeof(nameArray)/sizeof(char *); 
    int index = 0; 

    //printf("nElem =%d\n", nElem); 

    for(index=0; index < 4; index++) 
    { 
     printf("-> %s\n", nameArray[index]); 
    } 

    qsort(&nameArray[0], 4, sizeof(nameArray[0]), cstring_cmp); 

    printf("After sort\n"); 

    for(index=0; index < 4; index++) 
    { 
     printf("-> %s\n", nameArray[index]); 
    } 
    return 0 ; 
} 

( UPDATE:改變,因此我直接使用值(4)計算nelem個,而不是我的問題得到快速排序來工作)

+0

[段錯誤的qsort在C](http://stackoverflow.com/questions/10081370/qsort-segfault-in-c) – Florian

+2

'INT nelem個=的sizeof(nameArray)/的sizeof(炭的可能重複*);'..hmmmmm ... –

回答

1

的參數對比。函數只是指針,而不是指向指針的指針。

你也不需要投我相信,因爲參數是void *,你可以將它們分配給局部變量,編譯器會照顧它們。

試試這個:

int cstring_cmp(const void *a, const void *b) 
{ 
    const char *ia = a; 
    const char *ib = b; 
    return strcasecmp(ia, ib); 
} 

甚至擺脫局部變量,如果你不需要他們(只需要他們,如果你打算增加更多的代碼比較函數):

int cstring_cmp(const void *a, const void *b) 
{ 
    return strcasecmp(a, b); 
} 
0
int cstring_cmp(const void *a, const void *b) 
{ 
    return strcmp(a, b); 
}