【C++数据结构 | 字符串速通】10分钟秒杀字符串相关操作 | 字符串的增删改查 | 字符串与数组相互转换

字符串

by.Qin3Yu

文中所有代码默认已使用std命名空间且已导入部分头文件:

#include <iostream>
#include <string>
using namespace std;

概念速览

  • 字符串是一种非常好理解的数据类型,它用于存储和操作文本数据。字符串可以包含任意字符,包括字母、数字、特殊符号和空格等等。如下,是每个编程初学者几乎都会使用到的字符串:
cout << "Hello World";
  • 字符串(string)字符数组(char[]) 都可以存储多个字符,但是他们之间的却有着很大的区别,简单来说,字符串相比于字符数组有着以下优缺点:

优点:
1.方便操作: 字符串提供了许多方便的操作方法,如拼接、截取、查找、替换等。
2.动态内存: 字符串的长度是动态管理的,无需手动跟踪和更新。
3.可常量化: 字符串常量可以直接在代码中使用,而不需要手动创建和初始化字符数组。

缺点:
1.不可修改: 大多数编程语言中的字符串是不可修改的,即无法直接更改字符串中的单个字符。

  • 总之,字符串与字符数组相比具有更多的功能和便利性,但在对性能要求较高的情况下,字符数组可能是更好的选择。选择使用哪种类型取决于具体的应用场景和要求。

字符串操作

声明(string)与输入(cin)输出(cout)

  • 在导入了 <string> 头文件后,我们可以直接使用 string 关键字来声明一个字符串,然后使用C++的 标准输入输出流 来进行输入和输出。需要注意的是,字符串需要 用双引号进行包裹
string st;  // 声明一个字符串
cin >> st;  // 输入字符串
cout >> st  // 打印字符串
string st2 = "Genshin";  // 声明并初始化一个 "Genshin" 字符串
  • 需要注意:在上面的st2字符串中初始化字符串时,字符串末尾实际还会存在一个null终止符,当某些遍历方法遍历到此终止符时就知道此字符串被遍历完了,如下图所示:
    在这里插入图片描述

获取长度(length)与截取(substr)

  • 在字符串中,可以使用std::string类中的 length() 成员方法获取字符串的长度,或是使用 substr() 截取字符串。
  • 其中,substr() 有两种常用形式,它可以接受两个参数 (m,n) ,表示截取下标m~n的子字符串,或者接受一个参数 m ,表示截取从下标为m开始的后面所有字符串,如下面的代码所示:
    在这里插入图片描述
string st = "Genshin";
int len = st.length();  // len = 7
string s1 = st.substr(2,4);  // s1 = nsh
string s2 = st.substr(3);  // s2 = shin

查找(find)

  • 在字符串操作中,有两种常用方法查找字符串中的指定子串,分别是 find()rfind() ,它们两者的区别在于 find() 会返回子字符串第一次出现在字符串中的位置,而 rfind() 会返回子字符串最后一次出现在字符串中的位置。如下图所示,它们都会返回 子串的第一个字符在字符串中的索引
    在这里插入图片描述
string st = "Genshins";
int a = st.find("ns");  // a = 2
int b = st.rfind("ns");  // a = 6
  • 假如字符串中没有匹配的子串,那么 ®find 函数将会返回一个 string::npos 值,这个值解释起来稍显复杂,但是在实际应用中,读者可以直接用 if 语句如下检测 ®find 函数是否返回了 string::npos
if (pos == string::npos) { }

替换(replace)

  • 在字符串中,我们还可以使用 replace() 方法来修改指定片段的字符串。replace() 方法会接受三个参数,分别是 开始位置的索引、结束位置的索引和需要替换成的字符串 ,如下图所示,使用 replace() 替换字符串后,字符串会 自动调节大小
    在这里插入图片描述
string st = "Genshin";
st.replace(2,4,"mihoyo");  // st = "Gemihoyoin" , st.length() = 9
st.replace(2,4,"6");  // st = "Ge6in" , st.length() = 5

插入(insert)与删除(erase)

  • 关于字符串的修改,C++ 还有两种基本的方法,分别是 insert()erase()insert() 方法接受两个参数,分别是要 插入位置的下标和要插入的子串 ,插入后,子串的首字符会在第一个参数处,如下图所示:
    在这里插入图片描述
string st = "Genshin";
st.insert(3,"666");  // st = "Gen666shin"
  • 同样,erase() 方法也会接受两个参数,分别是要删除片段的 起始和结束位置的下标 ,如下图所示:
    在这里插入图片描述
string st = "Genshin";
st.erase(1,5);  // st = "Gn"

拼接(+ & append)

  • 最后,有两种方式可以将两个字符串拼接在一起,分别是直接使用 +号 和使用 append()方法 ,二者在使用上也有部分不同。
  • 将两个字符串直接使用 +号 连接,并传递给第三个字符串,原先的两个字符串没有做出任何修改:
string s1 = "Gen";
string s2 = "shin";
string s3 = s1 + s2;  // s3 = "Genshin"
  • 如下使用 append() 方法,append() 接受一个参数,即需要拼接的字符串,方法将会直接将子串拼接在字符串 st 后面,不需要第三个字符串:
string s1 = "Gen";
string s2 = "shin";
s1.append(s2);  // s1 = "Genshin"

string与char[]的相互转换

  • 在实际应用中,如果我们需要对字符串进行大量的修改,那么将 字符串(string) 转换为 字符数组(char[]) 再进行修改会是更好的选择。可以如下使用 data()方法 配合 copy()方法 将字符串转换为一个可修改的字符数组。特别注意,为了保证转换时的数据正确性,字符串与字符数组相互转换时,字符数组必须以终止符 ‘\0’ 结尾,因此,字符数组的长度要比字符串长1个字符
string st = "Genshin";
char s[st.length() + 1];  // 声明一个字符数组,长度为字符串长度+1
copy(st.data(), st.data() + st.length() + 1, s);  // 复制字符串到字符数组中
  • 再进行相关操作后,我们需要把字符数组再转换为字符串,我们可以直接使用 string 的构造函数 string(CharArray) 直接传入一个字符数组进行初始化,如下所示:
char s[] = {'G','e','n','s','h','i','n','\0'};
string st(s);  // st = "Genshin"

至此,字符串的相关内容已讲解完毕(=
如需提问,可以在评论区留言或私信(=
感谢您的阅读(=

by.Qin3Yu

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263237.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

data_loader返回的每个batch的数据大小是怎么计算得到的?

data_loader是一个通用的术语&#xff0c;用于表示数据加载器或数据批次生成器。它是在机器学习和深度学习中常用的一个概念。 一、data loader 数据加载器&#xff08;data loader&#xff09;是一个用于加载和处理数据集的工具&#xff0c;它可以将数据集划分为小批次&#…

六:Day03_Mybatis-Plus

一、介绍 MyBatis-Plus&#xff08;简称 MP&#xff0c;是由baomidou(苞米豆)组织开源的&#xff09;是一个基于 MyBatis 的增强工具&#xff0c;它对 Mybatis 的基础功能进行了增强&#xff0c;但未做任何改变&#xff0c;Mybatis-Plus 其实可以看作是对 Mybatis 的再一次封装…

Java 匿名内部类使用的外部变量,为什么一定要加 final?

问题描述 Effectively final Java 1.8 新特性&#xff0c;对于一个局部变量或方法参数&#xff0c;如果他的值在初始化后就从未更改&#xff0c;那么该变量就是 effectively final&#xff08;事实 final&#xff09;。 这种情况下&#xff0c;可以不用加 final 关键字修饰。 …

求导公式,求导的四则运算,复合函数求导

求导公式 求导的四则运算 复合函数求导

【Docker】Docker Compose,yml 配置指令参考的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

2c 操作符详解

文章目录 1. 操作符分类&#xff1a;2. 算术操作符3. 移位操作符(对二进制移位)3.1 左移操作符3.2 右移操作符 4. 位操作符(重要)5. 赋值操作符6. 单目操作符6.1 单目操作符介绍6.2 sizeof 和 数组 7. 关系操作符8. 逻辑操作符(重要)9. 条件操作符10. 逗号表达式11. 下标引用、…

订单系统的设计与海量数据处理实战

概述 订单系统可以说是整个电商系统中最重要的一个子系统&#xff0c;因此订单数据可以算作电商企业最重要的数据资产。订单系统从代码上来说可分为两部分&#xff1a;订单程序和历史订单处理程序。数据存储进行分库分表。 订单系统业务分析 对于一个合格的订单系统&#xf…

基础漏洞流量分析

基础漏洞流量分析 sql注入 sql注入原理 SQL 注入的攻击行为可以描述为通过用户可控参数中注入 SQL 语法&#xff0c;破坏原有 SQL 结构&#xff0c;达到编写程序时意料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的: 程序员在处理程序和数据库交互时&#x…

CleanMyMac2024破解版激活码许可证密钥

CleanMyMac X是一款颇受欢迎的专业清理软件&#xff0c;拥有十多项强大的功能&#xff0c;可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等&#xff0c;并且这款清理软件操作简易&#xff0c;非常好上手&#xff0c;特别适用于那些刚入手苹…

云计算大屏,可视化云计算分析平台(云实时数据大屏PSD源文件)

大屏组件可以让UI设计师的工作更加便捷&#xff0c;使其更高效快速的完成设计任务。现分享可视化云分析系统、可视化云计算分析平台、云实时数据大屏的大屏Photoshop源文件&#xff0c;开箱即用&#xff01; 若需 更多行业 相关的大屏&#xff0c;请移步小7的另一篇文章&#…

OpenSSL 编程指南

目录 前言初始化SSL库创建SSL 上下文接口(SSL_CTX)安装证书和私钥加载证书(客户端/服务端证书)加载私钥/公钥加载CA证书设置对端证书验证例1 SSL服务端安装证书例2 客户端安装证书创建和安装SSL结构建立TCP/IP连接客户端创建socket服务端创建连接创建SSL结构中的BIOSSL握手服务…

项目管理工具在电商新品运营中的应用与实践

运营永远是电商的核心命题&#xff0c;新品开发完成后&#xff0c;就进入了新品的运营工作&#xff0c;包括上架前的准备、上架后的推广、商品定位等&#xff0c;且运营一般同时负责多个新品的运营&#xff0c;任务多、时间紧、信息分散&#xff0c;如果缺乏统一管理入口&#…