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

【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

相关文章:

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

字符串 by.Qin3Yu 文中所有代码默认已使用std命名空间且已导入部分头文件&#xff1a; #include <iostream> #include <string> using namespace std;概念速览 字符串是一种非常好理解的数据类型&#xff0c;它用于存储和操作文本数据。字符串可以包含任意字符…...

运动重定向:C-3PO

C-3PO: Cyclic-Three-Phase Optimization for Human-Robot Motion Retargeting based on Reinforcement Learning解析 摘要1. 简介2. 相关工作2.1 运动重定向&#xff08;Motion Retargeting&#xff09;2.2 强化学习&#xff08;Reinforcement Learning&#xff09; 3. 预备知…...

天池SQL训练营(四)-集合运算-表的加减法和join等

-天池龙珠计划SQL训练营 4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 U…...

thinkphp lists todo

来由&#xff1a; 数据库的这个字段我想返回成&#xff1a; 新奇的写法如下&#xff1a; 逻辑层的代码&#xff1a; public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…...

【Flutter】创建应用顶级组件,应用根组件 (学习记录)

前言 在 Flutter 中&#xff0c;应用的顶级组件或根组件通常是在 main() 函数中通过 runApp() 方法创建的。这个组件通常是一个 MaterialApp、CupertinoApp、GetMaterialApp 或其他类似的应用框架组件。 以下是一个创建 MaterialApp 作为根组件的示例&#xff1a; void main()…...

AI材料专题报告:AI革命催生新需求国产替代推动新方向

今天分享的AI系列深度研究报告&#xff1a;《AI材料专题报告&#xff1a;AI革命催生新需求国产替代推动新方向》。 &#xff08;报告出品方&#xff1a;光大证券&#xff09; 报告共计&#xff1a;25页 1、算力需求增长催生 800G 光模块需求 算力是数字经济时代新生产力&…...

JVM 分析GC日志

GC日志参数 -verbose:gc 输出gc日志信息&#xff0c;默认输出到标准输出 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc -XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志&#xff0c;并在进程退出时输出当前内存各区域分配情况 -XX:PrintGCTimeStam…...

阿里云服务器环境配置,ssh免密登录和配置docker

此文章适合ubuntu20.04 64位和ubuntu22.04 64位版本 一.登陆服务器 租完服务器后&#xff0c;首选需要使用本地gitbash或者cmd进入服务器&#xff0c; 命令&#xff1a; ssh rootxxx xxx为服务器公网ip&#xff0c;然后yes&#xff0c;然后输入密码就会进入自己的服务器&am…...

【LeetCode】2621. 睡眠函数

睡眠函数 Promise异步 题目题解 题目 请你编写一个异步函数&#xff0c;它接收一个正整数参数 millis &#xff0c;并休眠 millis 毫秒。要求此函数可以解析任何值。 示例 1&#xff1a; 输入&#xff1a;millis 100 输出&#xff1a;100 解释&#xff1a; 在 100ms 后此异步…...

网络入门---TCP通信实现

目录标题 前言准备工作 tcpserver.hpp构造函数初始化函数(listen)运行函数(accept) tcpserver.cctcpclient.hpp构造函数初始化函数运行函数(connect) tcpclient.cc问题测试改进一&#xff1a;多进程改进二&#xff1a;多线程改进三&#xff1a;线程池完整代码 前言 在前面的文…...

neuq-acm预备队训练week 8 P2661 [NOIP2015 提高组] 信息传递

题目背景 NOIP2015 Day1T2 题目描述 有 n 个同学&#xff08;编号为 1 到n&#xff09;正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象&#xff0c;其中&#xff0c;编号为 i 的同学的信息传递对象是编号为 Ti​ 的同学。 游戏开始时&#xff0c;每人都…...

《C++新经典设计模式》之第18章 备忘录模式

《C新经典设计模式》之第18章 备忘录模式 备忘录模式.cpp 备忘录模式.cpp #include <iostream> #include <vector> #include <memory> using namespace std;// 保存对象内部状态&#xff0c;必要时恢复 // 在不破坏封装性的前提下&#xff0c;捕获对象的内部…...

OWASP安全练习靶场juice shop-更新中

Juice Shop是用Node.js&#xff0c;Express和Angular编写的。这是第一个 完全用 JavaScript 编写的应用程序&#xff0c;列在 OWASP VWA 目录中。 该应用程序包含大量不同的黑客挑战 用户应该利用底层的困难 漏洞。黑客攻击进度在记分板上跟踪。 找到这个记分牌实际上是&#…...

当使用RSA加密,从手机前端到服务器后端的请求数据存在+

将转成了空格&#xff0c;导致解密出错 将空格转成了...

BUUCTF crypto做题记录(3)新手向

目录 一、Rabbit 二、篱笆墙的影子 三、丢失的MD5 四、Alice与Bob 一、Rabbit 得到的密文&#xff1a;U2FsdGVkX1/ydnDPowGbjjJXhZxm2MP2AgI 依旧是看不懂是什么编码&#xff0c;上网搜索&#xff0c;在侧栏发现Rabbit解码&#xff0c;直接搜索就能有在线解码网站 二、篱笆…...

SpringMVC修炼之旅(2)基础入门

一、第一个程序 1.1环境配置 略 1.2代码实现 package com.itheima.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//定义…...

matlab 最小二乘拟合空间直线(方法二)

目录 一、算法原理1、算法过程2、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理...

ASPICE-汽车软件开发能力评级

Automotive SPICE&#xff08;简称A-SPICE 或 ASPICE&#xff09;&#xff0c;全称是“Automotive Software Process Improvement and Capacity dEtermination”&#xff0c;即“汽车软件过程改进及能力评定”模型框架。 常被用于评估一家汽车软件供应商的软件开发能力&#x…...

准确!!!在 CentOS 8 上配置 PostgreSQL 14 的主从复制

在 CentOS 8 上配置 PostgreSQL 14 的主从复制&#xff0c;并设置 WAL 归档到特定路径 /home/postgres/archive 的步骤如下&#xff1a; 主服务器配置&#xff08;主机&#xff09; 配置 PostgreSQL&#xff1a; 编辑 postgresql.conf 文件&#xff1a; vim /data/postgres/p…...

leetcode 1466

leetcode 1466 使用dfs 遍历图结构 如图 node 4 -> node 0 -> node 1 因为节点数是n, 边长数量是n-1。所以如果是从0出发的路线&#xff0c;都需要修改&#xff0c;反之&#xff0c;如果是通向0的节点&#xff0c;例如节点4&#xff0c;则把节点4当作父节点的节点&…...

想学编程,但不知道从哪里学起,应该怎么办?

怎样学习任何一种编程语言 我将教你怎样学习任何一种你将来可能要学习的编程语言。本书的章节是基于我和很多程序员学习编程的经历组织的&#xff0c;下面是我通常遵循的流程。 1&#xff0e;找到关于这种编程语言的书或介绍性读物。 2&#xff0e;通读这本书&#xff0c;把…...

Python数据科学视频讲解:Python概述

2.1 Python概述 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解2.1节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#xff0c;包括数据科学应用和…...

数据结构之内部排序

目录 7-1 直接插入排序 输入格式: 输出格式: 输入样例: 输出样例: 7-2 寻找大富翁 输入格式: 输出格式: 输入样例: 输出样例: 7-3 PAT排名汇总 输入格式: 输出格式: 输入样例: 输出样例: 7-4 点赞狂魔 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&a…...

软考高级备考-系统架构师(机考后新版教材的备考过程与资料分享)

软考高级-系统架构设计师 考试复盘1.考试结果2.备考计划3.个人心得 资料分享 考试复盘 1.考试结果 三科压线过&#xff0c;真是太太太太太太太幸运了。上天对我如此眷顾&#xff0c;那不得不分享下我的备考过程以及一些备考资料&#xff0c;帮助更多小伙伴通过考试。 2.备考…...

Spring Boot 整合kafka:生产者ack机制和消费者AckMode消费模式、手动提交ACK

目录 生产者ack机制消费者ack模式手动提交ACK 生产者ack机制 Kafka 生产者的 ACK 机制指的是生产者在发送消息后&#xff0c;对消息副本的确认机制。ACK 机制可以帮助生产者确保消息被成功写入 Kafka 集群中的多个副本&#xff0c;并在需要时获取确认信息。 Kafka 提供了三种…...

Java+Swing: 主界面组件布局 整理9

说明&#xff1a;这篇博客是在上一篇的基础上的&#xff0c;因为上一篇已经将界面的框架搭好了&#xff0c;这篇主要是将里面的组件完善。 分为三个部分&#xff0c;北边的组件、中间的组件、南边的组件 // 放置北边的组件layoutNorth(contentPane);// 放置中间的 Jtablelayou…...

pytorch:YOLOV1的pytorch实现

pytorch&#xff1a;YOLOV1的pytorch实现 注&#xff1a;本篇仅为学习记录、学习笔记&#xff0c;请谨慎参考&#xff0c;如果有错误请评论指出。 参考&#xff1a; 动手学习深度学习pytorch版——从零开始实现YOLOv1 目标检测模型YOLO-V1损失函数详解 3.1 YOLO系列理论合集(Y…...

YOLOv8配置文件yolov8.yaml解读

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 位置 该文件的位置位于 ./ultralytics/cfg/models/v8/yolov8.yaml 模型参数配置 # Parameters nc: 80 # number of classes scales: #…...

4-Tornado高并发原理

核心原理就是协程epoll事件循环&#xff0c;再使用协程之后&#xff0c;开销是特别的小&#xff0c;那具体如何提供高并发的呢&#xff1f; 异步非阻塞IO 这意味我们整套开发的模式不在与原来一样&#xff0c;正因为不再一样&#xff0c;所以有时我们在理解代码时就有可能会比…...

基于以太坊的智能合约开发Solidity(事件日志篇)

//声明版本号&#xff08;程序中的版本号要和编译器版本号一致&#xff09; pragma solidity ^0.5.17; //合约 contract EventTest {//状态变量uint public Variable;//构造函数constructor() public{Variable 100;}event ValueChanged(uint newValue); //事件声明event Log(…...