繁体   English   中英

字符串运算符 +(重载)char 数组和 string.in cpp 的不同行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM