2013-03-18 76 views
0

我想排序數組聲明爲string *names1 = new string[1];(數組的大小越來越大,添加更多項目)。Qsort不正確排序字符串數組

我把那裏的字符串。排序前陣的項目有: novot svobodovaa novakj6 3 vondraj1234

調用qsort(names1, size, sizeof (string), compare);後,在比較中實現這樣

int compare(const void * a, const void * b) { 
return (*(char*) a - *(char*) b); 
} 

在我的數組中的項目炒這樣 vondraj1234 novakj6 novot svobodovaa

是否有人知道,哪裏可以是不允許我按字母順序排列數組的錯誤?

+0

爲什麼你不使用'std :: vector',因爲你使用C++編碼?你不應該把'char *'強制轉換爲'string *'。 – RedX 2013-03-18 13:35:15

+0

使你的代碼更簡單: std :: vector a; std :: sort(a.begin(),a.end()); – AnatolyS 2013-03-18 13:39:14

+0

你的比較功能看起來很奇怪。如果你想按字母順序排序字符串,你可能需要使用strcmp函數嗎? – taocp 2013-03-18 13:46:26

回答

3

可以使用qsort與類型可以與memcpy複製。 std::string(以及任何其他類型的非平凡賦值運算符)不符合條件。相反,使用std::sort。它知道如何正確複製對象。

0

我要先挑剔你的問題的質量有些差,請耐心等待。

string *names1 = new string[1]; 

這給出了一個(1)字符串對象的數組。

(陣列的尺寸與添加更多的項目生長)

假。 你的數組的大小可能會這樣做,因爲你希望編寫代碼到這個特定的結尾。 數組的大小不會自動調整。 (這是什麼vector是。)

我把那裏的字符串。排序前的項目有:novot svobodovaa novakj6 3 vondraj1234

在一個字符串中?或者作爲一個字符串數組?在後一種情況下,我想看看一些證據,像這樣的:

for (size_t i = 0; i < size; ++i) 
{ 
    std::cout << i << ": " << names1[i] << "\n"; 
} 

理想只是你前行:

qsort(names1, size, sizeof (string), compare); 

(我只是希望,並認爲size實際上的的names1正確的大小,還有一件事,我的小環以上將被證明。)


的真正原因您TRO ubles然而,這條線:

return (*(char*) a - *(char*) b); 

你鑄造string *(指向對象)char *(指向普通的舊數據),而你正在做空調風格(char*),而不是C++風格( static_cast< char * >()),所以你的編譯器甚至不能正確投訴。

當您取消引用這兩個指針時,分別獲得兩個對象的第一個字節。這很可能是而不是包含的字符串的第一個字符,但是是跳轉表或機器代碼。因此,有點隨機的結果...