C++ 奇怪的堆栈/字符串行为 stack-stck; 字符串str; 标准推力('0'); str.append(“测试:”); //测试: cout

C++ 奇怪的堆栈/字符串行为 stack-stck; 字符串str; 标准推力('0'); str.append(“测试:”); //测试: cout,c++,string,stack,C++,String,Stack,&stck.top()是堆栈顶部的字符的地址。此表达式的类型为char* append方法的重载接受char*(实际上签名是string&append(const char*s);)期望指针指向以null结尾的字符串的开头,并以这种方式解释参数。它追加参数指向的字符,然后追加内存中的所有连续字符,直到第一个空字符。它读取并复制不属于堆栈的内存区域。&stck.top()是堆栈顶部的字符的地址。此表达式的类型为char* append方法的重载接受char*(实际上签名是string&append

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

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

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


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

Maciej Hehl关于为什么会出现不需要的行为是正确的

要获得所需的行为,需要附加字符本身,而不是指向它的指针。您(在对Kalim的回答的评论中)正确地说,
std::string::append
没有只需要一个
char
的覆盖。但是,有一个重写
std::string::append(std::size\u t,char)
,它将字符(第二个参数)追加一定次数(第一个参数)

所以写下你想要的东西的正确方法是:

 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;
或者,只需对
+=
运算符使用重载,该运算符接受
字符

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

关于你为什么会有不想要的行为,Maciej Hehl是正确的

要获得所需的行为,需要附加字符本身,而不是指向它的指针。您(在对Kalim的回答的评论中)正确地说,
std::string::append
没有只需要一个
char
的覆盖。但是,有一个重写
std::string::append(std::size\u t,char)
,它将字符(第二个参数)追加一定次数(第一个参数)

所以写下你想要的东西的正确方法是:

 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;
或者,只需对
+=
运算符使用重载,该运算符接受
字符

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