奇怪的堆栈/字符串行为

时间:2010-09-25 14:48:34

标签: c++ string stack

 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;

为什么会这样?

2 个答案:

答案 0 :(得分:3)

Maciej Hehl关于为什么你得到了不受欢迎的行为是正确的。

要获得所需的行为,您需要附加字符本身,而不是指向它的指针。你说(在你对Kalim的答案的评论中)没有覆盖只需要std::string::append的{​​{1}},这是正确的。但是,有一个覆盖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

答案 1 :(得分:2)

&stck.top()是位于堆栈顶部的char的地址。此表达式的类型为char*

append方法的重载,取char*(实际上签名为string& append ( const char* s );)要求指针指向以空字符结尾的字符串的开头并解释参数这条路。它追加参数指向的字符,然后追加内存中的所有连续字符,直到第一个空字符。它读取并复制不属于堆栈的内存区域。

相关问题