连接两个字符串

Concatenating two string

本文关键字:两个 字符串 连接      更新时间:2023-10-16

我读过很多关于为什么不能在c++中添加两个字符串字面值等的帖子,以及操作符+支持将字符串字面值添加到整数中。

然而,我试图理解以下代码中的编译器错误:

string str1, str2, str3;
int i = 10;
str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";

str1str2的初始化工作良好,但str3的构造会产生以下错误:

example.cpp: In function int main():
example.cpp:20:27: error:无效的const char*const char [5] to类型的操作数二进制operator+

Q1:在错误信息中,我理解const char [5]指的是"Mars"。整数i转换成char *后,const char*是指什么?

Q2: operator+具有从左到右的结合性,我猜str3的结构可以写成:
str3 = ("Hello " + i) + "Mars";

("Hello " + i)求值为char *吗?

Q3:在以下代码中:

str5 = string("foo ") + "bar ";
str6 = string("foo ") + "bar " + i;

str5的设置可以很好地编译,但是str6会生成大量的错误消息。string("foo ") + "bar "的结果是什么,它是"string"吗?

提前感谢您的建议。

str1接受字符串字面值(实际上是一个常量字符数组),将其衰减为指向第一个字符的指针,并在该指针上添加10,导致const char *在字符串字面值之外,这是未定义的行为,因为它超过了结束后的一个。

str2str1做同样的事情,但更过分。

str3"Hello"i做同样的事情,然后尝试将结果const char *添加到其他字符串字面量(再次,常量字符数组,由于被传递到函数中而衰减)。没有重载operator+来获取const char *const char *,因此你会得到错误。

请注意,这些都不会像您希望的那样工作。那些编译是未定义的行为。std::string已经重载了operator+来满足它的目的,所以向std::string添加字符串文字只是将它连接起来。添加一个整数有点模棱两可,但是(因此不支持operator+),所以你必须通过将其转换为字符串来明确你的意图:

str6 = string("foo ") + "bar " + std::to_string(i);

Q1:在错误信息中,我理解const char[5]'指的是"Mars"。const char*'指的是什么,转换为"char*"后的整数i ?

"Hello" + i的结果。

Q2:操作符+具有从左到右的结合性,我猜str3的构造可以写成:str3 = ("Hello " + i) + "Mars";

是否("Hello " + i)计算为char *?

是的。但是,它的计算结果为const char*

Q3:字符串("foo")+"bar"的结果是什么,它是一个"字符串"吗?

是的,这是std:string。你在str6 = string("foo ") + "bar " + i;中得到一个错误,因为你不能添加字符串和整数。

旁注-以下三个语句都不是初始化:

str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";

它们都调用赋值操作符

问题是,"Hello"字量被视为字符*。你可以通过给char*添加一个int来对它进行指针运算——你说的是"char*所指向的10个字符之外"。换句话说,就是垃圾。

简而言之,对于这种事情,您需要使用boost::lexical_cast或istringstream。