2012-10-25 27 views
3

我寫一個稱爲Word類,用於處理C字符串和重載 <><=>=運營商空C++分割誤差。當第一個參數是在比較操作過載

word.h

friend bool operator<(const Word &a, const Word &b); 

word.cc

bool operator<(const Word &a, const Word &b) { 
    if(a == NULL && b == NULL) 
    return false; 

    if(a == NULL) 
    return true; 

    if(b == NULL) 
    return false; 

    return strcmp(a.wd, b.wd) < 0; //wd is a valid c string, EDIT: changed to strcmp 
} 

main

char* temp = NULL;  //EDIT: i was mistaken, temp is a char pointer 
Word a("blah"); //a.wd = [b,l,a,h] 
cout << (temp<a); 

main的最後一行之後,我在operator<方法 的第一行之前得到了分段錯誤。我可以通過寫

cout << (a>temp); 

其中operator>類似地定義糾正問題,我沒有得到任何錯誤,但我 分配要求(temp < a)工作,所以這是我尋求幫助。

編輯:我犯了一個錯誤第一次和我說溫度是Word類型, ,但它實際上char*類型是。所以我假定編譯器使用我的一個構造函數將 temp轉換爲Word。我不知道它會使用哪一個 以及爲什麼這會起作用,因爲第一個參數不是Word

這裏我想構造被用來使用temp,使Word

Word::Word(char* c, char* delimeters="\n") { 
    char *temporary = "\0"; 
    if(c == NULL) 
    c = temporary; 
    check(stoppers!=NULL, "(Word(char*,char*))NULL pointer"); // exits the program if the expression is false 
    if(strlen(c) == 0) 
    size = DEFAULT_SIZE; //10 
    else 
    size = strlen(c) + 1 + DEFAULT_SIZE; 
    wd = new char[size]; 
    check(wd!=NULL, "Word(char*,char*))heap overflow"); 
    delimiters = new char[strlen(stoppers) + 1];  // EDIT: changed to [] 
    check(delimiters!=NULL,"Word(char*,char*))heap overflow"); 
    strcpy(wd,c); 
    strcpy(delimiters,stoppers); 
    count = strlen(wd); 
} 

wd類型爲char*

感謝看着這個大問題,並試圖幫助。讓我知道如果你 需要更多的代碼來看看

+0

請用您正在使用的語言標記問題 – sidyll

+1

我們需要看一些'Word'類。目前還不清楚如何與'NULL'進行比較,或'wd'成員是什麼。 – interjay

+0

你的調試器說什麼?你可以使用它的「trace into」或「step into」功能來逐步瞭解代碼的功能,包括如何將它轉換爲空字符*到Word的對象。 – StarPilot

回答

1

我幾乎可以肯定你不是故意要建立在堆char,而基於stoppers大小一些整數的初始值:

delimiters = new char(strlen(stoppers) + 1); // Should use [] not() 

此外,您正在使用C++,我永遠不會告訴你該做什麼,但請,除非你確切知道沒有危險,不要使用strcpy。正是這個原因。

這是一個字符串的盲目拷貝,並且當目的地沒有足夠的空間時(如錯誤分配的情況那樣),事情就會變得很糟糕。

編輯:

我也看到你的operator<超載您使用

a.wd < b.wd 

並聲稱.wds是有效的C字符串。如果是這樣的話,你不能簡單的<操作適用於他們,而且必須使用strcmpstrncmp或其他一些全比較功能

+1

哦,等等,你的意思是用[]而不是()?這很有趣,因爲這個代碼是我的大學教授給我的。讓我們添加它,看看它是否有幫助。 **編輯:**不,我仍然得到一個分割錯誤。 – fvf

+0

@ user1774515我不是教授,顯然不知道這個問題的背景,但是100次中有99次,這不是那個意圖的成語。 –

+1

是的,沒有打算謝謝你的提示。還有,是的,我的教授強調了strcpy的危險。 – fvf

0

切割出的構造的其他位:

Word::Word(char* c, char* delimeters=NULL) { 
    check(stoppers!=NULL, "(Word(char*,char*))NULL pointer"); //exits the program if the expression is false 
    delimiters = new char[strlen(stoppers) + 1]; 
    check(delimiters!=NULL,"Word(char*,char*))heap overflow"); 
    strcpy(delimiters,stoppers); 
} 

您分配並複製到輸入參數()而不是成員變量(stoppers)。因此,當您撥打:

delimiters = new char[strlen(stoppers) + 1]; 

這裏,stoppers == NULL(從check通話infered),所以strlen(NULL)崩潰。

此外,在:

bool operator<(const Word &a, const Word &b) 

你檢查之類的東西a == NULL。這不是必需的,因爲ab是引用,所以對象是非空的。

如果wd可以爲空,則需要更改這些以檢查a.wdb.wd

+0

你好!我認爲從該行的評論(blah)中可以看出,如果該語句爲* false *,程序將退出。因此,check()調用後,stoppers爲!= NULL。 –

+0

好吧,我將默認值設置爲「\ n」而不是NULL。你能否更詳細地解釋一下a怎麼不能爲NULL。我應該做一個* == NULL? – fvf

+0

@ user1774515引用不能指向一個NULL對象,所以是的,* a將是一個合適的檢查(注意變量前面的星號,而不是後面的) –