2011-12-02 73 views
2

我想排序一個結構運行數組稱爲結果由char,但是當我打印數組時,沒有排序。看看這個:qsort結構數組不工作

struct run { 
    char name[20], weekday[4], month[10]; 
    (And some more...) 
}; 
typedef struct run run; 

int name_compare(const void *a, const void *b) 
{ 
    run *run1 = *(run **)a; 
    run *run2 = *(run **)b; 
    return strcmp(run1->name, run2->name); 
} 

int count_number_of_different_persons(run results[]) 
{ 
    int i = 0; 


    qsort(results, sizeof(results)/sizeof(run), sizeof(run), name_compare); 

    for(i = 0; i <= 999; i++) 
    { 
    printf("%s\n", results[i].name); 
    } 
    // not done with this function yet, just return 0 
    return 0; 
} 

從上面的輸出僅僅是一個名字在他們的順序最初放置

回答

5
int count_number_of_different_persons(run results[]) 

列表這並沒有真正讓您在陣列上使用sizeof ,因爲數組被腐蝕爲指針。

run *run1 = *(run **)a; 

看起來也怪異,應該不會是

run *run1 = (run*)a; 

+0

'void * a'和'void * b'是指向數組項的指針。如果數組本身由指向struct類型的指針組成,那麼'void * a'的正確類型就是'(run **)a'。這仍然只是一個指向指針的指針,所以爲了獲得指向結構體的指針,這個指針指針必須被解除引用。因此,'*(run **)a'。雖然它看起來像這裏,但數組不是指針數組,而是一個直線數組,因此在聲明'(run *)a'時會進行正確的轉換。 (我剛纔遇到這個問題,發現這篇文章,認爲它會幫助其他人)。 –

+0

@NickBauer,我真的希望它能幫助別人,但4年後,我無法真正解密它,因爲它脫離了語境,也懶得重讀和重新思考原始問題和答案。 –

3

一個問題是name_compare。嘗試這個代替:

int name_compare(const void *a, const void *b) 
{ 
    run *run1 = (run *)a; 
    run *run2 = (run *)b; 
    return strcmp(run1->name, run2->name); 
} 
3

檢查以下代碼:

如@michel提到的,的sizeof(陣列)提供了指針的大小,陣列本身的不大小,如同時使陣列將被處理作爲指針。因此,要麼將元素的數量發送到函數count_number_of_different_persons,要麼定義一個元素個數的MACRO。希望這可以幫助。 :)。

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

#define NOE 3 

struct run 
{ 
    char name[20]; 
}; 

typedef struct run run; 

int name_compare (const void *a, const void *b) 
{ 
    return strcmp (((run *)a)->name, ((run *)b)->name); 
} 

int count_number_of_different_persons(run results[], int noOfElements) 
{ 
    int i=0; 
    qsort(results, noOfElements, sizeof (run), name_compare); 
    for (i=0; i<noOfElements; i++) 
     printf ("%s\n",results[i].name); 
} 

int main (int argc, char * argv[]) 
{ 
    run a, b, c; 
    run arg[NOE]; 

    strcpy (a.name, "love"); 
    strcpy (b.name, "you"); 
    strcpy (c.name, "i"); 
    arg[0] = a; 
    arg[1] = b; 
    arg[2] = c; 

    count_number_of_different_persons(arg, sizeof(arg)/sizeof(run)); 
};