Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串运算符+;(重载)cpp中char数组和string.in的不同行为_C++_Arrays_String_Char_Operator Overloading - Fatal编程技术网

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

C++ 字符串运算符+;(重载)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

我尝试使用字符串运算符合并两个数组。 下面的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时,这个例子就不能正常工作了。我很困惑为什么会这样

    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) + "{";