当前位置: 首页 > news >正文

【语法】C++中string类中的两个问题及解答

贴主在学习string类时遇到过两个困扰我的问题,今天拿出来给大家分享一下我是如何解决的

一、扩容时capacity的增长问题

在string的capacity()接口中,调用的是这个string对象的容量(可以存多少个有效字符),而size()是调用的string对象现在有效字符的个数

string s1;
cout << s1.size() << endl << s1.capacity() << endl;

 直接定义一个空的string对象,然后分别输出它的size和capacity,结果会是0和15

这是因为capacity默认一开始是15(只要size没有超过15)

如果超过了15,capacity会增容到31,从这里开始就有规律了

 每次都是差不多1.5倍的关系

然而,如果在实例化string对象时直接初始化一个大于15的字符串

string s1("Hello World! 123");
cout << s1.size() << endl << s1.capacity() << endl;

它这里会输出16和16,为什么这次超过了15,但不会扩容到31?

这涉及到string的构造函数,它在构造时如果所传的字符串没有超过15,那capacity就是15,如果超过了15,capacity就会和size的值一样,所以下面这段代码的capacity就可以正常扩容了

string s1("Hello");
s1+=" World! 123";//再尾插这个字符串
cout << s1.size() << endl << s1.capacity() << endl;

这次输出的就是16和30了

二、string的存储问题

string和C语言的char*类型最大的区别就是string不是以\0结束,而是会输出全部的有效字符

这串代码会输出什么? 

string s = "Hello \0World";
cout << s << endl;
s+="nihao";
cout << s << endl;

答案是会输出Hello 和Hello nihao

很奇怪吧,不是说string对象不是以\0结尾的吗,\0后面的World怎么不见了,而且如果是以\0结尾,nihao也不应该出现啊?

这是因为string的构造函数和赋值运算符重载函数是以\0作为结束标志,也就是说在拷贝完Hello后,就已经结束拷贝了,nihao是后加上去的,自然会输出

那要怎么样才能发挥string可以输出\0后面的字符的特性呢?

string s = "Hello ";
s +='\0';
s+="World";
cout << s << endl;
s+="nihao";
cout << s << endl;

这时输出的就是Hello World和Hello Worldnihao了

也就是说,既然字符串是读取到\0,那直接以单个字符的形式插入\0就可以了

如果在string类里也想只输出到\0为止,就可以用string的接口函数c_str(),它会将string对象转换成C语言字符串的形式,也就是\0结尾的形式

string s = "Hello ";
s +='\0';
s+="World";
s+="nihao";
cout << s.c_str() << endl;

这次输出的就是Hello 了

相关文章:

  • 计算机毕业设计SpringBoot+Vue.js音乐网站(源码+文档+PPT+讲解)
  • 【Leetcode 每日一题】132. 分割回文串 II
  • Linux篇——工具
  • 每天一个Flutter开发小项目 (9) : Flutter状态管理进阶 - Provider构建你的简易购物车应用
  • ViewPager2跟ViewPager的区别
  • 基于单片机的智能扫地机器人
  • 完美解锁便捷版!
  • Linux:文件系统
  • 【Linux网络#10】:Https协议原理
  • hatitat-sim的agent.py各部分组成
  • 深入理解推理语言模型(RLM)
  • 【Linux】进程替换(七)
  • 微信小程序点击按钮,将图片下载到本地
  • [Computer Vision]实验六:视差估计
  • 使用haproxy实现MySQL服务器负载均衡
  • js 之 lodash函数库 的下载与基础使用
  • 企微审批中MySQL字段TEXT类型被截断的排查与修复实践
  • C++ 的 if 判断语句教程
  • 2025年AI网络安全攻防战:挑战深度解析与全链路防御体系构建指南
  • springboot项目Maven打包遇到的问题总结
  • 上海老字号卖黄金,与动漫IP联名两周销售额近亿元
  • 会谈时间迟迟未定、核心议题存在分歧,俄乌“土耳其谈判”一波三折
  • 回望星河深处,唤醒文物记忆——读《发现武王墩》
  • 熊出没!我驻日本札幌总领馆提示中国公民注意人身安全
  • 2025年上海科技节5月17日启动,56家重点实验室和大科学设施将向公众开放
  • 万科:存续债券均正常付息兑付