C++ 字符串运算符+;(重载)cpp中char数组和string.in的不同行为
我尝试使用字符串运算符合并两个数组。 下面的case可以正常工作,+运算符接受char*和stringC++ 字符串运算符+;(重载)cpp中char数组和string.in的不同行为,c++,arrays,string,char,operator-overloading,C++,Arrays,String,Char,Operator Overloading,我尝试使用字符串运算符合并两个数组。 下面的case可以正常工作,+运算符接受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时,这个例子就不能正常工作了。我很困惑为什么会这样 s
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]
(包括空终止符char),它可以衰减为const char*
。那么a+“{/code>只是无效的指针算术(加法)
您需要将其中一个操作数更改为std::string
,以便调用
a + std::string("{");
或者使用(从C++14开始)
C样式字符串的结尾有一个nul终止符('\0'
)。处理它们的库代码使用nul终止符查找字符串的结尾
const char *a = "abc";
这里,“abc”
是一个由4个字符组成的数组,就像您编写的
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
类型的对象中,您可以执行两个单独的操作:
std::string s = a;
s += "{";
或者,您可以显式地将一个(或两个)C样式字符串转换为std::string
:
std::string s = std::string(a) + "{";
我通常更喜欢第一种方法,但第二种方法肯定是合理的。这是不可能的,但您必须声明字符的大小,包括空字符。变量a和b应该是字符a[6],字符b[7]非常感谢,你能告诉我你们是怎么知道这么多关于编程的,我的意思是我应该做些什么来获得这么多的知识和清晰的概念。你能帮忙吗?我是一名计算机工程师,有一年的专业经验experience@aromahola——读一两本好书,继续写代码,不要羞于寻求帮助。谢谢你的帮助回答。好的,当然,如果可能的话,你能推荐一些关于实用方法、设计模式和cpp核心概念的好书吗?我读过Geeksforgek的所有这些主题。我可以看到关于这些主题还有很多其他的书。@aromahola——是的,我知道我忽略了这些。这是通常的链接。
std::string s = std::string(a) + "{";