2010-10-31 74 views
1

我正在使用內置的qsort對結構數組進行排序。但在調用qsort之後,數組中的最後一個元素似乎具有它的值,即我將其設置爲空。c qsort似乎刪除數組中的最後一個值

這裏是我的代碼...

int numEntries = 5; 
TvEntry* entries[numEntries]; //create array 

//Entries get added to the array here... 

qsort(*entries, numEntries, sizeof(TvEntry*), &compareByName); //sort 

displayAll(entries, numEntries); //display 

//here is my sort method 
int compareByName(const void* val1, const void* val2) 
{ 
    const TvEntry* entry1 = (TvEntry*)val1; 
    const TvEntry* entry2 = (TvEntry*)val2; 
    return strcasecmp(entry1->title, entry2->title); 
} 

//here is my display method 
void displayAll(TvEntry* entries[], int length) 
{ 
    if(entries == NULL) 
    { 
     printf("List is empty\n"); 
    } 
    else 
    { 
     int i = 0; 
     for(i = 0; i < length; i++) 
     { 
      printf("ENTRY: %s\n", entries[i]->title); 
     } 
    } 
} 

我應該指出,如果我註釋掉調用快速排序,然後正確地顯示所有項目,但快速排序時調用,則條目均顯示線(未排序)併爲最後一個條目的標題打印空白值。

回答

10
qsort(*entries, numEntries, sizeof(TvEntry*), &compareByName); 

是錯誤的,您不想取消引用數組的第一個元素。讓它

qsort(entries, numEntries, sizeof(TvEntry*), &compareByName); 

而且,你的比較功能可按會收到指針的元素,元素是指針,所以它應該是如

int compareByName(const void* val1, const void* val2) 
{ 
    const TvEntry** entry1 = (TvEntry**)val1; 
    const TvEntry** entry2 = (TvEntry**)val2; 
    return strcasecmp((*entry1)->title, (*entry2)->title); 
} 
+0

qsort應該調用「compareByName」(不帶「&」!)。 strcasecmp不是ANSI C – user411313 2010-10-31 12:28:46

+0

有沒有也沒關係,但是&只是多餘的。 – nos 2010-10-31 12:31:47

+0

感謝您的完美幫助。 – Ben 2010-10-31 23:49:32