我尝试使用字符串运算符合并两个数组。下面的情况很好用,+运算符接受char*和string。
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 + "{";有人能解释一下吗。
发布于 2020-08-09 19:33:36
因为"{"不是std::string,而是const char[2] (包括空终止符),它可能会衰减为const char*。那么a + "{"只是指针运算(加法),这是无效的。
您需要将两个操作数中的任何一个更改为std::string,才能调用operator+ for std::string。例如:
a + std::string("{");或者使用literals (从C++14开始)。
a + "{"s;发布于 2020-08-09 21:26:32
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类型为6char数组,b类型为7char数组。
第二个问题是,即使在这个问题得到解决之后,
std::string s = a + "{"并不像看上去的那样。"{"是一个C风格的字符串(即一个char数组)。对于两个C样式字符串,没有+运算符。要将两个C样式字符串连接到类型为std::string的对象中,您可以执行两个单独的操作:
std::string s = a;
s += "{";或者,您可以显式地将一个(或两个)C样式字符串转换为std::string
std::string s = std::string(a) + "{";我通常更喜欢第一种方法,但第二种方法肯定是合理的。
https://stackoverflow.com/questions/63325784
复制相似问题