字符串string中“\0“与‘\0‘的打印、拼接问题

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;
	}

猜你喜欢

转载自blog.csdn.net/SwordArcher/article/details/115701815