连接两个字符串
Concatenating two string
我读过很多关于为什么不能在c++中添加两个字符串字面值等的帖子,以及操作符+支持将字符串字面值添加到整数中。
然而,我试图理解以下代码中的编译器错误:
string str1, str2, str3;
int i = 10;
str1 = "Hello " + i;
str2 = i + "Mars";
str3 = "Hello " + i + "Mars";
str1
和str2
的初始化工作良好,但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*
是指什么?
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 *
在字符串字面值之外,这是未定义的行为,因为它超过了结束后的一个。
str2
和str1
做同样的事情,但更过分。
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。
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 两个字符串之间的数学运算
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)
- 我需要在C++的两个字符串之间找到共同的前缀
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 给定两个字符串 S 和 T.确定与 T 相差最小的 S 子字符串?
- gtest:检查字符串是否等于两个字符串之一
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 我可以在系统()中使用两个字符串吗?