首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串运算符+(重载)字符数组和string.in cpp的不同行为

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

Stack Overflow用户
提问于 2020-08-09 19:29:54
回答 2查看 56关注 0票数 2

我尝试使用字符串运算符合并两个数组。下面的情况很好用,+运算符接受char*和string。

代码语言:javascript
复制
    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时,这种情况不能很好地工作。我很困惑为什么会这样呢?

代码语言:javascript
复制
    string s = "";;
    char a[5] = { 'f', 'i', 'r', 's', 't' };
    char b[6] = { 's', 'e', 'c', 'o', 'n', 'd' };
    s = a + "{";

有人能解释一下吗。

EN

回答 2

Stack Overflow用户

发布于 2020-08-09 19:33:36

因为"{"不是std::string,而是const char[2] (包括空终止符),它可能会衰减为const char*。那么a + "{"只是指针运算(加法),这是无效的。

您需要将两个操作数中的任何一个更改为std::string,才能调用operator+ for std::string。例如:

代码语言:javascript
复制
a + std::string("{");

或者使用literals (从C++14开始)。

代码语言:javascript
复制
a + "{"s;
票数 1
EN

Stack Overflow用户

发布于 2020-08-09 21:26:32

C样式字符串的末尾有一个nul终止符('\0')。处理它们的库代码使用nul终止符来查找字符串的结尾。

代码语言:javascript
复制
const char *a = "abc";

在这里,"abc"是一个由4个char组成的数组,就好像您已经编写了

代码语言:javascript
复制
const char *a = { 'a', 'b', 'c', '\0' );

如果省略了'\0',库代码将不会知道您只对放入初始化器中的三个字符感兴趣。它根本不会正常工作。在形式上,这种行为是未定义的;程序所做的任何事情都是合法的。

要使此代码正常工作,请向每个C样式字符串添加一个nul结束符:

代码语言:javascript
复制
char a[] = { 'f', 'i', 'r', 's', 't', '\0' };
char b[] = { 's', 'e', 'c', 'o', 'n', 'd', '\0' };

注意,我从a[5]b[6]中删除了数组大小。编译器将从初始化器中找出它。a类型为6char数组,b类型为7char数组。

第二个问题是,即使在这个问题得到解决之后,

代码语言:javascript
复制
std::string s = a + "{"

并不像看上去的那样。"{"是一个C风格的字符串(即一个char数组)。对于两个C样式字符串,没有+运算符。要将两个C样式字符串连接到类型为std::string的对象中,您可以执行两个单独的操作:

代码语言:javascript
复制
std::string s = a;
s += "{";

或者,您可以显式地将一个(或两个)C样式字符串转换为std::string

代码语言:javascript
复制
std::string s = std::string(a) + "{";

我通常更喜欢第一种方法,但第二种方法肯定是合理的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63325784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档