连接两个字符串

时间:2013-04-16 21:43:43

标签: c++ string

我已经阅读了很多帖子,说明为什么在C ++等中不能添加两个字符串文字,而运算符+支持将字符串文字添加到整数。

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

string str1, str2, str3;
int i = 10;

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

str1str2的初始化工作正常,但str3的构造会出现以下错误:

  

example.cpp:在函数int main()中:
  example.cpp:20:27:错误:类型为const char*const char [5]的操作数无效   二进制operator+

Q1:在错误消息中,我了解const char [5]是指"Mars"const char*引用了什么,转换为i后的整数char *

Q2:operator+具有从左到右的关联性,我猜测str3的构造可以写成:

str3 = ("Hello " + i) + "Mars";

("Hello " + i)是否评估为char *

问题3:在以下代码中:

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

设置str5编译正常,但str6生成错误消息的加载(页面和一半)。 string("foo ") + "bar "的结果是什么,是"string"

提前感谢任何见解。

3 个答案:

答案 0 :(得分:7)

str1获取字符串文字(实际上是一个常量字符数组),将其衰减为指向第一个字符的指针,并向该指针添加十个,从而产生一个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);

答案 1 :(得分:3)

  

Q1:在错误消息中,我理解const char [5]'指的是“Mars”。在转换为“char *”后,conconst char *'引用的是整数i?

它指的是"Hello" + i的结果。

  

Q2:运营商+具有从左到右的关联性,我猜测str3的构造可以写成:   str3 =(“你好”+ i)+“火星”;

     

(“Hello”+ i)是否评估为char *?

是。不过,它的评估结果为const char*

  

问题3:字符串(“foo”)+“bar”的结果是什么,它是“字符串”吗?

是的,它是std:string。您在str6 = string("foo ") + "bar " + i;中收到错误,因为您无法添加字符串和整数。

附注 - 以下三个陈述中没有一个是正式的:

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

他们都调用赋值运算符。

答案 2 :(得分:1)

事情是,“你好”文字被视为char *。你可以通过添加一个int来对char *进行指针运算 - 你说的是“超出char *指向的10个字符”。换句话说,垃圾。

简而言之,你需要使用boost :: lexical_cast或istringstream来处理这类事情。