为什么在通过添加字符串文字和字符串进行初始化时不会打印字符串

时间:2017-03-13 13:16:40

标签: c++ string

在案例1中,当我初始化这样的字符串时输出空白

 #include <iostream>
 #include<string>

 using namespace std;
 //CODE 1
 int main()
 {
    string s="hello" + 'c';
    cout<<s<<endl;
    return 0;
 }

但是当我以这种方式写它时它可以正常工作:

 #include <iostream>
 #include<string>

 using namespace std;
 //CODE 2
 int main()
 {
     string s="hello";
     char k='c';
     s+=k;
     cout<<s<<endl;
     return 0;
 }

现在我很困惑,因为在堆栈溢出问的另一个问题上它说当使用 namespace std 时字符串和std :: string之间没有区别,那些答案就是说 - &gt; string和std :: string之间没有功能差异,因为它们属于同一类型 std::string vs string in c++ 而为这个问题提供的答案指出了不同之处:

编译器是g ++(GCC)4.8.5 20150623(Red Hat 4.8.5-4)

5 个答案:

答案 0 :(得分:6)

当你有

string s="hello" + 'c';

它等于

string s=("hello" + 'c');

ASCII encoding

相同
string s=("hello" + 99);

相同
string s=(&"hello"[99]);

也就是说,你得到一个指向字符串"hello"的第100个元素的指针,它只有六个元素(不要忘记终结符)。

超出界限会导致未定义的行为

答案 1 :(得分:3)

因为"string"不是std::string而是const char*,并且指针加上数字(字符是&#34;只是&#34;数字)使用指针算术,所以在你添加之后,你会得到一个const char*,它可能指向你的字符串文字之后的垃圾记忆。

第二个示例有效,因为在这种情况下,s 一个std::string,其中有operator +=个字符,使用指针算法。

答案 2 :(得分:3)

代码不一样。在

string s="hello" + 'c';

"hello"不是std::string。它是一个字符串文字,类型为const char[N]。当你向数组中添加一个字符衰减到指针并且你正在做指针运算。该算法将超过字符串文字的末尾,因此它是未定义的行为。

为了让第一个代码像第二个例子一样,你需要使"hello"成为一个字符串。您可以将用户定义的文字用于std::string,如

string s = "hello"s + 'c';

或只使用像

这样的构造函数调用
string s = std::string("hello") + 'c';

答案 3 :(得分:1)

表达式"hello" + 'c';正在向char类型添加const char[6]类型,结果模糊不清。正式地,第一个参数衰减为const char*指针,并使用指针算法的常规规则将c添加到该指针。行为可能未定义,因为c的数值在我遇到的所有编码中都是一个大于6的值,所以你最终尝试索引const char数组"hello"之外的元素。

在第二个版本中,您利用+=类的重载std::string运算符,以char为参数,字符c连接到该字符串。

答案 4 :(得分:0)

"hello" + 'c'指针超过"hello"的末尾(例如,假设ASCII字符集,'c'具有数值99"hello" + 99给出指向99'h'之后"hello"个字符的内存位置的指针。

使用这样的指针初始化std::string会产生未定义的行为。

&#34;代码2&#34;作品std::stringoperator+=()接受char,并将其附加到字符串的末尾。