1."\0"为字符串长度为0的字符串指针,它与""等价
2.打印"\0"与'\0'相同,cout输出时都会显示为空
'\0'在string的初始化和拼接中size大小的不同
string s1 = "aaa\0bbb";
cout << s1.size() << endl; //3
cout << s1 << endl; //aaa
cout << s1[3] << endl; //结尾为\0打印空
cout << "---------------" << endl;
string s2 = "aaa";
s2 += '\0';
s2 += "bbb";
cout << s2.size() << endl; //7
cout << s2 << endl; //aaabbb
cout << "---------------" << endl;
s2 += '\0';
cout << s2.size() << endl; //8
在初始化时s1时,当读取到了字符串中的\0时,便认为该字符串已经到了结尾,后面的字符就不会算在内,由于size所计算的大小不会包括结尾的\0,所以size大小为3,而当我们使用s2这种拼接方式虽然在中间拼接了\0,但是并不会以这个\0作为string的结尾,而会将这个拼接的\0当成一个数据来存储,string会记录这个值,并将它算在size的大小中,所以打印出来的s2的size大小为7,即使是在末尾追加了一个\0,在计算size的时候也要计算在内,所以string的size大小并不是单纯看\0之前数据的数量,不同的方式进行赋值结果是不同的。
cout打印string时与'\0'无关与size有关
在以上代码中我们可以发现,在使用cout打印出俩个string值,打印结果也不相同,这是因为cout打印string时并不是单纯以\0为结尾进行打印,而是和string的size大小相关,在打印时会根据size的大小往下进行打印,即使在打印过程中遇见\0也不会停止,直到打印完全,所以s2打印出来的结果为aaabbb中间的\0打印为空
以下为string.h中对<<的重载函数:
template<class _Elem, class _Traits, class _Alloc>
inline basic_ostream<_Elem, _Traits>& operator<<(basic_ostream<_Elem, _Traits>& _Ostr, const basic_string<_Elem, _Traits, _Alloc>& _Str)
{ // insert a string
return (_Insert_string(_Ostr, _Str.data(), _Str.size()));
}
可以看到的是将size的大小进行了传递,由此可知,打印string的结果和string的size大小有关,与\0无关。
string拼接"\0"与'\0'的不同
借鉴自:https://bbs.csdn.net/topics/391024751
."\0"为字符串长度为0的字符串指针,与""等价,所以在拼接的时候不会将其加入到string中,所以不会影响size的大小,而'\0'与之相反。
string s("1");
s += "\0";
s += "23";
cout << s << endl; //123
cout << s.size() << endl; //3
cout << strlen(s.c_str()) << endl; //3
cout << "------------------" << endl;
string s2("1");
s2 += "\023"; //023表示八进制数,等于19,所以"\023"表示ascii码为19的一个字符
cout << s2 << endl;
cout << s2.size() << endl; //2
cout << strlen(s2.c_str()) << endl; //2
cout << "------------------" << endl;
string s3("1");
s3 += '\0';
s3 += "23";
cout << s3 << endl; //123
cout << s3.size() << endl; //4
cout << strlen(s3.c_str()) << endl; //1
cout << "------------------" << endl;
string s4 = "\0";
s4 += '\0';
cout << s4 << endl;
cout << s4.size() << endl; //1
cout << strlen(s4.c_str()) << endl; //0
cout << "------------------" << endl;
string s5 = "";
if (s5 == "\0")
cout << "==" << endl; //==
//打印俩者相同
cout << "\0" << endl;
cout << '\0' << endl;
strlen与'\0'
我们已经知道string中的size大小和cout打印string时,与'\0'并没有绝对的关系,但是strlen却与之不同,strlen的实现就会去检测'\0',当检测到第一个'\0'时就会停止,并返回当前累计的数量来计算出字符串的长度,所以要切记的是string的size大小和strlen的大小并不完全相等。
string与系统默认字符串的不同
遍历打印系统默认字符串时会打印出末尾的\0,而string是经过封装的,遍历打印时不会打印出\0
for (auto c : "123456")
{
cout << "--" << c << endl;
}
cout << endl;
string s = "123456";
for (auto c : s)
{
cout << "--" << c << endl;
}
s += '\0';
cout << endl;
for (auto c : s)
{
cout << "--" << c << endl;
}