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

news/2024/11/16 20:49:14/

在这里插入图片描述

👦个人主页:@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语言角度来看,字符串以‘\0’为结束标志,应该输出hello string,而string类的字符串竟然算上了'\0',并且是与size有关。

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

在这里插入图片描述

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

在这里插入图片描述

因此,我们因得出结论:

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

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

#include <iostream>
#include <string>
using namespace std;int main()
{// 代码片段1:string s1("hello\0string");cout << s1 << endl;// 代码片段2:string s2 = "hello w\0orld";cout << s2 << endl;return 0;
}

【输出结果】

在这里插入图片描述

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

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

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

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


http://www.ppmy.cn/news/1041638.html

相关文章

ImageKit10 VCL Crack

ImageKit10 VCL Crack ImageKit10 VCL是一个允许您快速轻松地将图像处理功能添加到应用程序中的组件。使用ImageKit10 VCL&#xff0c;您可以编写从TWAIN扫描仪和数码相机检索图像的应用程序;加载和保存图像文件&#xff0c;并将图像从一种格式转换为另一种格式;编辑图像、在图…

TDD(测试驱动开发)?

01、前言 很早之前&#xff0c;曾在网络上见到过 TDD 这 3 个大写的英文字母&#xff0c;它是 Test Driven Development 这三个单词的缩写&#xff0c;也就是“测试驱动开发”的意思——听起来很不错的一种理念。 其理念主要是确保两件事&#xff1a; 确保所有的需求都能被照…

构建可远程访问的企业内部论坛

文章目录 前言1.cpolar、PHPStudy2.Discuz3.打开PHPStudy&#xff0c;安装网页论坛所需软件4.进行网页运行环境的构建5.运行Discuz网页程序6.使用cpolar建立穿透内网的数据隧道&#xff0c;发布到公网7.对云端保留的空白数据隧道进行配置8.Discuz论坛搭建完毕 前言 企业在发展…

基于JAVA的仓库管理系统java库房仓储进销存jsp源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于JAVA的仓库管理系统 系统有2权限&#xff1a;用户…

视频上传,限制时长,获取视频时长

使用element的upload上传文件时&#xff0c;除了类型和大小&#xff0c;需求需要限制只能长传18秒内的视频&#xff0c;这里通过upload的before-upload&#xff0c;以及创建一个音频元素对象拿到durtaion时长属性来实现。 getVideoTime(file) {return new Promise(async (resol…

密码学学习笔记(十九):密码学关键术语的解释1

数据加密标准(DES) 数据加密标准是使用最广泛的加密体制&#xff0c;它于1977年被美国国家标准和技术研究所(NIST)采纳为联邦信息处理标准FIPS PUB 46。 DES3DESAES明文分组长度&#xff08;位&#xff09;6464128密文分组长度&#xff08;位&#xff09;6464128密钥长度&…

C++模板元编程(6)模板参数替换(Template argument substitution)

文章目录 1、什么是模板参数替换2、实例3、模板参数替换规则 1、什么是模板参数替换 模板参数替换&#xff08;Template argument substitution&#xff09;&#xff1a;在函数模板实例化的过程中&#xff0c;模板参数会被替换为实际的参数类型或值。这个替换过程称为模板参数…

element-Plus中el-menu菜单无法正常收缩解决方案

<el-menu :collapse"true">如图所示收缩之后&#xff0c;有子级的菜单还有箭头文字显示 从代码对比看层级就不太对了&#xff0c;嵌套错误了&#xff0c;正常下方官网的ul标签下直接是li&#xff0c;在自己的代码中&#xff0c;ul标签下是div标签&#xff0c;层…