2010-09-25 91 views
1
stack <char> stck; 
string str; 

stck.push('0'); 

str.append("test:"); 
//test: 
cout << str << endl; 

str.append(&stck.top()); 
//test:0═══════════════¤¤¤¤▌▌▌▌,╘╥XЕ┤ 
cout << str << endl; 

這是爲什麼發生?奇怪的堆棧/字符串行爲

回答

3

Maciej Hehl是正確的爲什麼你會得到不想要的行爲。

要獲得您想要的行爲,您需要追加字符本身,而不是指向它的指針。你說的正確(在你對Kalim的回答的評論中),沒有覆蓋std::string::append,只需要char。但是,有一個覆蓋std::string::append(std::size_t, char),它將字符(第二個參數)附加一定次數(第一個參數)。

所以正確的方式來寫,你想會是什麼:

str.append(1, stck.top()); // Append one copy of the character at the top of the stack 

,或者,只使用過載爲+=運營商,它接受一個char

str += stck.top(); 
+0

感謝它的工作! – nawriuus 2010-09-25 15:01:47

2

&stck.top()是位於堆棧頂部的char的地址。這個表達式的類型是char*

append方法,即採用char*(實際上該簽名是string& append (const char* s);)的過載期望指針指向的空終止字符串的開頭和解釋以這種方式的論點。它追加參數指向的字符,然後追加內存中的所有連續字符,直到第一個空字符。它讀取並複製不屬於堆棧的內存區域。