【C++初阶】string类字符串包不包含‘\0‘

在这里插入图片描述

个人主页:@Weraphael
✍作者简介:目前学习C++和算法
✈️专栏:C++航路
希望大家多多支持,咱一起进步!
如果文章对你有帮助的话
欢迎 评论 点赞 收藏 加关注✨


在我模拟实现string类的时候,我发现了一个神奇的事情:

int main()
{
	string s1("hello string");
	s1 += '\0';
	s1 += "world";

	cout << "长度为:" << s1.size() << endl;

	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i];
	}
	cout << endl;

	cout << s1 << endl;

	return 0;
}

【输出结果】

【C++初阶】string类字符串包不包含‘\0‘_第1张图片

以C语言角度来看,字符串以‘\0’为结束标志,应该输出hello string,而string类的字符串竟然算上了'\0',并且是与size有关。

vs的输出可能对'\0'进行了优化,监视窗口能更好观察效果。

【C++初阶】string类字符串包不包含‘\0‘_第2张图片

为了能更好的对比结果,可以将string类转化为const char*,也就是C语言类型的字符串

【C++初阶】string类字符串包不包含‘\0‘_第3张图片

因此,我们因得出结论:

  • C-style string:C语言的字符串是以字符数组的形式存储的,没有内建的字符串类型。'\0'是空字符,也被称为字符串终止符,用于表示字符串的结束。在遍历一个字符数组时,可以通过检查是否遇到了'\0'来确定字符串何时结束。
  • string:C++引入了std::string类作为字符串类型,它可以自动追踪字符串的长度,并且不需要以'\0'结尾来表示字符串的结束。std::string类内部会维护一个表示字符串长度的成员变量size,因此可以动态地改变字符串的长度而不需要手动添加终止符。

一些误区:
当某些人看完这篇文章,并自己做实验可能就会写出以下代码并产生疑问:

#include 
#include 
using namespace std;

int main()
{
	// 代码片段1:
	string s1("hello\0string");
	cout << s1 << endl;

	// 代码片段2:
	string s2 = "hello w\0orld";
	cout << s2 << endl;

	return 0;
}

【输出结果】

【C++初阶】string类字符串包不包含‘\0‘_第4张图片

有人就会发出疑问,开头不是讲过了,string类会算上'\0',那对象s1会输出hello strings2会输出hello w orld

有这个问题的人就是对string类还不够熟悉。

s1是由用C字符串构造,而C字符串是以'\0为结束标志,因此实际上是拿"hello"拷贝构造s1

同样的道理,s2也是由C字符串来赋值重载的,因此实际是拿“hello w”来赋值的。

你可能感兴趣的:(C++,c++,开发语言,c语言,学习,笔记,面试)