[英]string operator + (overloaded) different behavior for char array and string.in cpp
我尝试使用字符串运算符合并 2 arrays。 以下案例工作正常,+ 运算符接受 char* 和字符串。
string s = "";;
char a[5] = { 'f', 'i', 'r', 's', 't' };
char b[6] = { 's', 'e', 'c', 'o', 'n', 'd' };
s = a + string(b);
但是当我传递 char* 和 string 时,这种情况不能正常工作。 我很困惑为什么会这样?
string s = "";;
char a[5] = { 'f', 'i', 'r', 's', 't' };
char b[6] = { 's', 'e', 'c', 'o', 'n', 'd' };
s = a + "{";
有人可以解释一下吗?
因为"{"
不是std::string
,而是const char[2]
(包括 null 终止符字符),它可能衰减为const char*
。 然后a + "{"
只是无效的指针算术(加法)。
您需要将任一操作数更改为std::string
以使 std::string 的std::string
operator+
被调用。 例如
a + std::string("{");
或使用文字(C++14 起)。
a + "{"s;
C 风格的字符串末尾有一个 nul 终止符 ( '\0'
)。 处理它们的库代码使用 nul 终止符来查找字符串的结尾。
const char *a = "abc";
在这里, "abc"
是一个 4 char
的数组,就像你写的一样
const char *a = { 'a', 'b', 'c', '\0' );
如果您省略了'\0'
,库代码将不会知道您只对放入初始化程序中的三个字符感兴趣。 它根本无法正常工作。 形式上,行为是未定义的; 该程序所做的任何事情都是合法的。
要使此代码正常工作,请为每个 C 样式字符串添加一个 nul 终止符:
char a[] = { 'f', 'i', 'r', 's', 't', '\0' };
char b[] = { 's', 'e', 'c', 'o', 'n', 'd', '\0' };
请注意,我从a[5]
和b[6]
中删除了数组大小。 编译器将从初始化程序中找出它。 a
的类型是“6 个char
的数组”, b
的类型是“7 个char
的数组”。
第二个问题,即使在这个问题得到解决之后,是
std::string s = a + "{"
不做它看起来的样子。 "{"
是 C 风格的字符串(即char
数组)。 两个 C 风格的字符串没有+
运算符。 要将两个 C 风格的字符串连接到std::string
类型的 object 中,您可以执行两个单独的操作:
std::string s = a;
s += "{";
或者您可以将一个(或两个)C 样式字符串显式转换为std::string
:
std::string s = std::string(a) + "{";
我通常更喜欢第一种方法,但第二种方法当然是合理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.