2014-09-05 54 views
2

我試圖連接兩個字符串到這樣一個新的(finalString): finalString =字符串1 +「&」 +字符串2C++動態分配初始值

首先,我分配的內存finalString,然後我使用strcat()。

finalString = new char[strlen(string1) + strlen(string2) + 2]; 

cout << finalString << endl; 

finalString = strcat(finalString , string1); 
finalString = strcat(finalString , "&"); 
finalString = strcat(finalString , string2); 

cout << finalString << endl; 

我會假設string1是「Mixt」,而string2是「Supermarket」。

輸出看起來是這樣的:

═════════════════řřřř  //(which has 21 characters) 
═════════════════řřřřMixt&Supermarket 

我知道,如果我在使用「新字符」圓括號的字符串將被初始化爲0,我會得到期望的結果,但我的問題是爲什麼第一個輸出有21個字符,假設我只分配了17個字符。即便如此,爲什麼最後的字符串長度超過了初始分配大小(21> 17)呢?

在此先感謝!

+2

爲什麼你不能使用['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)? – 2014-09-05 00:53:57

+2

'finalString'從未初始化開始,所以這是未定義的行爲。你應該將第一個元素設置爲0(例如'finalString [0] = 0;') – 2014-09-05 00:54:02

+0

當你說「字符串將被初始化爲0」時,你錯了。 – Barmar 2014-09-05 00:54:32

回答

0

兩個詞「緩衝區溢出」

的原因,你有21個字符最初是因爲有一個「/ 0」(也稱爲空)字符從存儲器地址finalString點到22個字符之遙。根據你的記憶,這可能會或可能不一致。

至於你有什麼比你想要的長的原因,你在初始緩衝區之外寫入隨機存儲器。你沒有崩潰,因爲你沒有寫一些重要的東西。

strcat將獲取給定的內存地址,找到它找到的第一個'/ 0',並從該位置複製數據,從您提供的第二個內存指針開始,直到找到第一個'/ 0'爲止。

你在做什麼是非常危險的,如果你在擊中某些重要事件之前沒有擊中「/ 0」,會導致崩潰或至少是不良行爲。

在C/C++中冒泡一個char []只是指向第一個元素的初始內存位置的指針。沒有SAFEGUARDS!你一個人一定要小心。

如果你設置了finalString [0] = 0的第一個字符,那麼你的邏輯會更好。

0

由於不同的答案,爲什麼不使用std::string

std::string a, b, c; 
a = "part1"; 
b = "part2"; 
c = a + " & " + b; 
std::cout << c << '\n'; 

part1 & part2 

活生生的例子:http://ideone.com/pjqz9T

它將使你的生活更輕鬆!您應該始終使用c++來使用stl類型。

如果你真的需要char *那麼最後你可以做c.c_str()

+0

這不是我的問題。我想知道爲什麼第一個cout打印21個字符而不是17個,因爲只有17個字符被分配。 – 2014-09-05 00:59:37

+0

@IoanFulgeanu這很好,這是一個不同的,更簡單的方法來做你想做的事情,如果你需要使用'char數組',那麼我相信你有一個理由。 – 2014-09-05 01:00:48

0

您的字符串未初始化,導致未定義的行爲。在strcat中,找到空字符時會附加字符串。

因此,正如其他人已經提到的,要麼你可以做 finalString[0] = 0;

或代替你的第一個strcat使用strcpy的。這將複製第一個字符串並在末尾放置一個空字符。

爲什麼21個字符?

這是由於未定義的行爲。它將繼續打印,直到它不會找到null,否則只要它嘗試訪問任何非法內存,它就會崩潰。你