使用连接将字符转换为字符串时出现垃圾
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";
我通过将字符与空字符串 ("") 连接来将其转换为字符串。但它会导致结果字符串中出现未定义的行为或垃圾字符。为什么会这样?
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";