2016-02-29 81 views
0

我有一個正在處理的字符串類的附加函數部分,並且在使用時發生了一些非常奇怪的事情。當我打印出附加字符串裏面功能,然後也main,它的工作原理。但是當我註釋掉功能中的打印部分並且將打印留在main時,輸出是一些隨機字符。下面是代碼:C++字符串追加函數奇怪行爲

String.cpp:

void String::append(const String buf) 
{ 
    char c[99]; 

    for (auto i = 0; i < this->length(); ++i) { 
     c[i] = this->cstr()[i]; 
    } 

    for (auto i = this->length(); i < (this->length() + buf.length() + 1); ++i) { 
     c[i] = buf.cstr()[i - this->length()]; 
    } 

    *this = c; 
    printf("%s\n", *this); // if I comment this line out then the append function doesn't work properly 
} 

主要:

int main() 
{ 
    String a = "Hello"; 
    String b = "Hi"; 
    a.append(b); 
    printf("%s\n", a); 
} 

當使用兩個打印功能時,輸出是這樣的:

當僅使用主打印功能時:

什麼可能導致這種情況?謝謝。


編輯:

賦值運算符:

String &String::operator=(char* buf) { 
    _buffer = buf; 
    return *this; 
} 

構造:

String::String(char* buf) : _buffer(buf), _length(0) { 
    setLength(); 
} 
+0

複製一個陣列顯示您的賦值運算符(S)和字符串構造函數。 – paddy

+0

我已添加它們。 –

+0

您不能在您的班級中存儲不再存在的指針。這是未定義的行爲。你需要保持一個數組(最大大小),或者使用動態內存(使用標準容器使這更容易)。另外,你忘了從'operator ='調用'setLength'。 – paddy

回答

2
char c[99]; 

是具有自動存儲持續時間的陣列。在離開append()函數後,使用指向第一個元素的指針(又名c)是未定義的行爲。

通過您的賦值操作符存儲它不會保存數據或防止它被刪除。

爲了保留您需要使用new和delete處理動態分配的數據(這將是一些努力,考慮構造函數,析構函數,賦值,複製構造函數/賦值)或者您需要複製數據到您以前分配的緩衝區。

辦法的字符看this question

+0

謝謝,這很有道理。但是我仍然無法弄清楚如何保存數據。你能否詳細說明這個建議? –

+0

我已經添加了一個鏈接,其中解釋了複製數組的方法。 – Anedar

+0

非常感謝! –