在案例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)
答案 0 :(得分:6)
当你有
时string s="hello" + 'c';
它等于
string s=("hello" + 'c');
相同
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::string
有operator+=()
接受char
,并将其附加到字符串的末尾。