使用连接将字符转换为字符串时出现垃圾

Garbage when converting character to string using concatenation

我通过将字符与空字符串 ("") 连接来将其转换为字符串。但它会导致结果字符串中出现未定义的行为或垃圾字符。为什么会这样?

char c = 'a';
string s = ""+c;
cout<<s<<" "<<s.size()<<"\n";

让我们看一下您的代码片段,一次看一个语句或一行。

char c = 'a';

这是有效的,将字符文字分配给类型为 char 的变量。
注意:由于c在这条语句之后没有改变,你可能需要将定义声明为const。

string s = ""+c;

让我们重构:
std::string s = ("" + c);

让我们添加类型转换以使观点更清楚:
std::string s = ((const char *) "" + (char) c);

运算顺序是在赋值给字符串变量之前解析赋值运算符右侧(右侧)的所有表达式。

C++ 中没有 operator+() 需要一个 const char * 和一个字符。
编译器正在寻找这个函数:operator+(const char *, char).
这是编译错误的主要原因。

cout<<s<<" "<<s.size()<<"\n";
字符串分配和创建失败,因此 s 为空且 s.size() 为零。

一个有趣的问题,看起来像是编译器在编译时没有检测到的问题。
我已经在 Cygwin 上用 GNU C++ 10.2 试过了,你的代码片段生成了这个。

0200312 (Fedora Cygwin 9.3.0-1) 31

如果将 char c = 'c'; 替换为 char c = '[=15=]';,则输出为

 0

所以看起来像是某种内存违规问题。

您可能知道,附加字符的标准方法是使用 push_back

string s = "";
s.push_back(c);
cout << s << " " << s.size() << "\n";

或者您可以使用运算符 +=

string s = "";
s += c;
cout << s << " " << s.size() << "\n";