2013-04-24 46 views
0

我寫了以下嘗試使用qsort()函數。我的目標是輸入幾行文本並打印每個單詞的字母列表。這段代碼每次運行時崩潰,我不知道爲什麼或者如何修復它。我還需要添加一些內容來計算單詞出現的次數,並將其打印出來,但我非常確定該怎麼做。任何建議都會非常有幫助。謝謝!C + + qsort問題

#include <algorithm> 
#include <iostream> 
#include <string> 
using namespace std; 

struct to_lower 
{ 
    int operator() (int ch) 
    { 
    return tolower (ch); 
    } 
}; 

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

int main() 
{ 
    string list[900]; 
    int nLength; 
    int i=0, q=0; 
    string nTemp; 
    int word[900]; 

    cout 
     << "Enter some lines of text " 
     << "(Enter Ctrl-Z on a line by itself to exit)\n" 
     << endl; 

    while (!cin.eof()) 
    { 
    cin >> list[i]; 

    transform(list[i].begin(), list[i].end(), list[i].begin(), to_lower()); 
    word[q]=1; 

    if (list[i]==list[i-1]) 
    { 
     word[q]=+1; 
    } 
    i++; 
    } 

    nLength = i; 

    cout << "The sorted words would be:\n"; 

    qsort(list, nLength, sizeof list[0],&compare); 

    int n; 
    for (n = 0; n < nLength; n++) 
    { 
    cout <<" \n"<< n << list[n]<< word[n]; 
    } 
    return 0; 
} 
+4

當i = 0時,您正試圖訪問'list [i-1]',並給出了一個負索引。崩潰的可能原因。 – Mahesh 2013-04-24 18:56:27

+8

這是C假裝C++。如果你真的想編寫C++,可以使用'std :: vector',並編寫自己的'std :: less'或'operator <'實現,這將使你能夠使用'std :: sort'。 – 2013-04-24 18:56:57

+0

在發佈之前,請花費幾分鐘的時間仔細檢查代碼的縮進情況。它需要修復:您可以通過點擊帖子下方的「修改」來編輯您的問題來完成此操作。 – Lundin 2013-04-24 19:12:14

回答

2

std::string不是char*爲您的qsort比較函數假裝。另外,你不應該在C++對象中使用qsort。 qsort不知道對象,不會調用複製構造函數,並可能會損壞內部結構。

當i = 0時,使用list [i-1]是個bug。

您需要在排序後計算出您的重複單詞,否則您不能保證重複單元彼此相鄰。

+0

另外,即使比較函數被固定爲使用字符串而不是char *,qsort仍然不起作用,因爲它不是「簡單」類型,因爲它具有用戶定義的拷貝構造函數等。 – 2013-04-24 19:16:30

+0

@DerekLedbetter什麼使得你這麼說? – 2013-04-24 19:18:11

+1

@DanielKamilKozar:qsort使用逐位複製例程交換元素,如memcpy。這隻適用於微不足道的類型。不重要的類型,如'std :: string',需要使用其複製構造函數或賦值運算符進行復制。 – 2013-04-24 19:49:18