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

C++重新入门-string容器

目录

1.包含头文件

 2.创建字符串

3.获取字符串长度

4.字符串拼接

5.字符串比较

相等性比较

大小比较

使用比较函数

6.访问字符串

7.查找子串

8.字符串修改

替换子串

插入字符或子串

删除字符或子串

9.提取子串

10.总结


当谈到C++中的字符串时,std::string 容器是一个非常方便且强大的工具。它是C++标准库中的一部分,提供了许多操作字符串的方法。下面是一个简单的解释和示例:

1.包含头文件

在使用 std::string 之前,需要包含 <string> 头文件。

#include <string>

 2.创建字符串

你可以通过多种方式创建一个字符串对象。

std::string str1;                 // 空字符串
std::string str2 = "Hello";       // 使用字符串常量初始化
std::string str3("World");        // 使用构造函数初始化
std::string str4(5, 'X');         // 使用重复字符初始化,产生 "XXXXX"

3.获取字符串长度

你可以使用 size() 方法获取字符串的长度。

std::string str = "Hello";
int length = str.size();        // length 现在为 5

4.字符串拼接

使用 + 操作符可以将两个字符串拼接起来。

std::string str1 = "Hello";
std::string str2 = "World";
std::string combined = str1 + " " + str2;    // combined 现在为 "Hello World"

5.字符串比较

在 C++ 中,字符串比较是通过比较两个字符串中的字符来确定它们之间的大小关系。字符串比较通常涉及以下几种情况:

  1. 相等性比较:判断两个字符串是否完全相等。
  2. 大小比较:确定两个字符串的大小关系,即确定一个字符串是位于另一个字符串之前、之后还是相等。

在 C++ 中,字符串比较通常使用 ==!=<<=>>= 这些操作符来完成。这些操作符都是针对字符串的字符按顺序进行比较的。字符串比较是按字典序进行的,即从左到右依次比较字符,直到找到不同的字符或者一个字符串结束。

下面是字符串比较的一些示例:

相等性比较

std::string str1 = "apple";
std::string str2 = "banana";if (str1 == str2) {std::cout << "Strings are equal" << std::endl;
} else {std::cout << "Strings are not equal" << std::endl;
}

大小比较

std::string str1 = "apple";
std::string str2 = "banana";if (str1 < str2) {std::cout << "str1 comes before str2" << std::endl;
} else if (str1 > str2) {std::cout << "str1 comes after str2" << std::endl;
} else {std::cout << "str1 and str2 are equal" << std::endl;
}

使用比较函数

除了操作符外,你也可以使用 compare() 成员函数来进行字符串比较。这个函数返回一个整数,表示两个字符串的大小关系。

std::string str1 = "apple";
std::string str2 = "banana";int result = str1.compare(str2);if (result == 0) {std::cout << "Strings are equal" << std::endl;
} else if (result < 0) {std::cout << "str1 comes before str2" << std::endl;
} else {std::cout << "str1 comes after str2" << std::endl;
}

需要注意的是,compare() 函数返回值的含义是:

  • 如果 result 为 0,则表示两个字符串相等。
  • 如果 result 小于 0,则表示 str1 在字典序上位于 str2 之前。
  • 如果 result 大于 0,则表示 str1 在字典序上位于 str2 之后。

这些是在 C++ 中进行字符串比较的基本方法。你可以根据实际需要选择适合的方法来比较字符串。

6.访问字符串

使用下标操作符 []:你可以像访问数组一样使用下标来访问字符串中的字符。字符串的第一个字符索引是0。

std::string str = "Hello";
char ch = str[0];  // 访问第一个字符 'H'

使用 at() 成员函数at() 函数提供了与下标操作符类似的功能,但它提供了越界检查,并在越界时引发 std::out_of_range 异常。

std::string str = "Hello";
char ch = str.at(1);  // 访问第二个字符 'e'

7.查找子串

在 C++ 中,你可以使用 find() 方法来查找一个子串在字符串中的位置。find() 方法返回子串在字符串中第一次出现的位置索引,如果子串不存在,则返回 std::string::npos

以下是使用 find() 方法查找子串的示例:

#include <iostream>
#include <string>int main() {std::string str = "Hello World";// 查找子串 "World" 在字符串中的位置size_t found = str.find("World");if (found != std::string::npos) {std::cout << "Substring found at position: " << found << std::endl;} else {std::cout << "Substring not found" << std::endl;}return 0;
}

在这个示例中,字符串 "Hello World" 中的子串 "World" 被找到,并且它在字符串中的起始位置是6。如果子串不存在,则 find() 方法返回 std::string::npos,表示子串未找到。

find() 方法还可以接受额外的参数,用于指定搜索的起始位置。例如,你可以从指定的位置开始搜索子串:

size_t found = str.find("World", 7);  // 从索引 7 开始查找子串

这将从字符串中的索引7(包括索引7)开始查找子串 "World"

另外,如果你想反向查找子串,可以使用 rfind() 方法,它会从字符串的末尾开始搜索子串,类似于 find(),但是从字符串的尾部向前搜索。

size_t found = str.rfind("World");  // 从末尾开始查找子串

这就是在 C++ 中查找子串的基本方法。你可以根据实际需求使用这些方法来查找并处理字符串中的子串。

8.字符串修改

替换子串

你可以使用 replace() 方法来替换字符串中的子串。这个方法允许你指定要替换的起始位置和长度,并提供替换的字符串。

#include <iostream>
#include <string>int main() {std::string str = "I like apples";// 替换 "apples" 为 "oranges"str.replace(str.find("apples"), 6, "oranges");std::cout << str << std::endl; // 输出:I like orangesreturn 0;
}

插入字符或子串

你可以使用 insert() 方法在字符串的指定位置插入字符或子串。

#include <iostream>
#include <string>int main() {std::string str = "Hello";// 在索引 5 处插入子串 " World"str.insert(5, " World");std::cout << str << std::endl; // 输出:Hello Worldreturn 0;
}

删除字符或子串

你可以使用 erase() 方法删除字符串中的字符或子串。

#include <iostream>
#include <string>int main() {std::string str = "Hello World";// 从索引 6 开始删除 5 个字符str.erase(6, 5);std::cout << str << std::endl; // 输出:Helloreturn 0;
}

9.提取子串

substr() 方法用于提取字符串中的子串,并返回一个新的字符串。它接受两个参数:起始位置和要提取的子串的长度。如果省略第二个参数,则提取从起始位置到字符串末尾的所有字符。

以下是 substr() 方法的基本用法示例:

#include <iostream>
#include <string>int main() {std::string str = "Hello World";// 从索引 6 开始提取子串,直到字符串末尾std::string sub1 = str.substr(6);std::cout << "Substring 1: " << sub1 << std::endl; // 输出:World// 从索引 0 开始提取长度为 5 的子串std::string sub2 = str.substr(0, 5);std::cout << "Substring 2: " << sub2 << std::endl; // 输出:Helloreturn 0;
}

在这个示例中,str.substr(6) 提取了从索引6开始到字符串末尾的子串,结果是 "World"。而 str.substr(0, 5) 提取了从索引0开始长度为5的子串,结果是 "Hello"

substr() 方法非常有用,可以用于从字符串中提取感兴趣的部分,然后进行进一步处理。

10.总结

// 查找子串
size_t find(const std::string& str, size_t pos = 0) const;// 返回字符串长度
size_t size() const noexcept;// 比较字符串
int compare(const std::string& str) const noexcept;// 访问指定位置的字符
char& at(size_t pos);
const char& at(size_t pos) const;// 替换子串
void replace(size_t pos, size_t len, const std::string& str);// 插入子串
void insert(size_t pos, const std::string& str);// 删除子串
void erase(size_t pos, size_t len);// 提取子串
std::string substr(size_t pos, size_t len = std::string::npos) const;

 


 

相关文章:

C++重新入门-string容器

目录 1.包含头文件 2.创建字符串 3.获取字符串长度 4.字符串拼接 5.字符串比较 相等性比较 大小比较 使用比较函数 6.访问字符串 7.查找子串 8.字符串修改 替换子串 插入字符或子串 删除字符或子串 9.提取子串 10.总结 当谈到C中的字符串时&#xff0c;std::str…...

C语言头歌:指针进阶

第1关&#xff1a;输出若干个学生成绩中的最高分.要求用指针函数实现 任务描述 题目描述:读入n(1 < n < 1000)个学生的成绩&#xff0c;成绩都为整数&#xff0c;用指针函数求出若干个学生成绩的最高分。用数组名作为函数参数&#xff0c;指针作为函数返回值。 ####相关…...

【C++】一个求数组中最大元素的函数模板

题目 设计一个分数类 F r a c t i o n Fraction Fraction&#xff0c;再设计一个名为 M a x e l e m e n t Max_element Maxe​lement 的函数模板&#xff0c;能够求数组中最大的元素&#xff0c;并用该模板求一个 F r a c t i o n Fraction Fraction 数组中的最大元素。 C…...

SpringCloud Alibaba(保姆级入门及操作)

第一章 微服务概念 1.0 科普一些术语 科普一下项目开发过程中常出现的术语,方便后续内容的理解。 **服务器:**分软件与硬件,软件:类型tomcat这种跑项目的程序, 硬件:用来部署项目的电脑(一般性能比个人电脑好) **服务:**操作系统上术语:一个程序,开发中术语:一个…...

SpringBoot集成Activiti案例

前言 Activiti项目是一项新的基于Apache许可的开源BPM平台&#xff0c;从基础开始构建&#xff0c;旨在提供支持新的BPMN 2.0标准&#xff0c;包括支持对象管理组&#xff08;OMG&#xff09;&#xff0c;面对新技术的机遇&#xff0c;诸如互操作性和云架构&#xff0c;提供技…...

Vulnhub靶机:basic_pentesting_2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.4&#xff09; 靶机&#xff1a;basic_pentesting_2&#xff08;10.0.2.7&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.c…...

复试PAT乙级day33

PAT乙级1106~1110 1106_2019数列有一个测试点过不了 1109_擅长C 这题不会&#xff0c;通过的是别人的代码 1110_区块反转 这题跟1105_链表合并 的处理很像。值得注意的是分段区间翻转用 大转小转 的方式。这题也有一个测试点通不过。...

npm ERR! path /Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3

在使用npm时&#xff0c;有时候您可能会遇到类似以下错误的权限问题&#xff1a; npm ERR! path /Users/apple/.npm/_cacache/index-v5/11/77/cf18d9ab54d565b57fb3 npm ERR! code EACCES npm ERR! errno -13 npm ERR! syscall open npm ERR! Error: EACCES: permission denie…...

震惊!python类型的自动化测试框架原来这么简单!

自2018年被评选为编程语言以来&#xff0c;Python在各大排行榜上一直都是名列前茅。目前&#xff0c;它在Tiobe指数中排名第三个&#xff0c;仅次于Java和C。随着该编程语言的广泛使用&#xff0c;基于Python的自动化测试框架也应运而生&#xff0c;且不断发展与丰富。 因此&am…...

人脸高清算法GFPGAN之TensorRT推理

1. 综述 最近由于做数字人项目&#xff0c;采用的是wav2lip GFPGAN进行人脸面部高清&#xff0c;但GFPGAN模型本身比较大&#xff0c;所以想着使用TensorRT来代替原始的pth推理看看能否提升运行速度&#xff0c;于是便开始了这趟windows1之下进行GFPGAN的trt推理的折腾之旅。…...

05 OpenCV图像混合技术

文章目录 理论算子示例 理论 其中 的取值范围为0~1之间 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 参数1&#xff1a;输入图像Mat …...

2326. 王者之剑(网络流,最小割,最大权独立集,最小点权覆盖)

活动 - AcWing 给出一个 nm 网格&#xff0c;每个格子上有一个价值 vi,j 的宝石。 Amber 可以自己决定起点&#xff0c;开始时刻为第 0 秒。 以下操作&#xff0c;在每秒内按顺序执行。 若第 i 秒开始时&#xff0c;Amber 在 (x,y)&#xff0c;则 Amber 可以拿走 (x,y) 上的…...

内网信息搜集

目录 内网基础知识 基本流程图 怎么判断是否在域内 常规信息类收集-应用&服务&权限等 cs信息搜集 bloodhound安装及使用 内网基础知识 工作组&#xff1a;将不同的计算机按照功能分别列入不同的组&#xff0c;想要访问某个部门的资源&#xff0c;只要在【网络】里…...

微型力量,巨大作用:嵌入式技术的创新应用

微型力量&#xff0c;巨大作用&#xff1a;嵌入式技术的创新应用 嵌入式技术是一种将计算机技术嵌入到各种设备和系统中的技术&#xff0c;它的应用范围非常广泛&#xff0c;包括但不限于智能手机、智能家居、医疗设备、工业自动化等领域。这种微型的技术在各个领域中发挥着巨…...

华为 OD 一面算法原题

2.2 亿彩票公布调查结果 昨天&#xff0c;闹得沸沸扬扬的《10 万中 2.2 亿》的彩票事件&#xff0c;迎来了官方公告。 简单来说&#xff0c;调查结果就是&#xff1a;一切正常&#xff0c;合规合法。 关于福利彩票事件&#xff0c;之前的推文我们已经分析过。 甚至在后面出现《…...

FPGA-学会使用vivado中的存储器资源ROM(IP核)

问题&#xff1a; 某芯片,有500个寄存器,需要在上电的时候由FPGA向这些寄存器中写入初始值,初始值已经通过相应的文档给出了具体值,这些值都是已知的。 分析关键点&#xff1a; 数据量比较多&#xff08;Verilog代码&#xff0c;通过case语句、always语句这种查找表的方式,数…...

自测-1 打印沙漏

文章预览&#xff1a; 题目算法代码 题目 算法 以前做过这个&#xff0c;那次是c语言写的&#xff0c;一点一点处理一层一层完成&#xff0c;这次我换了一种语言用了另一种思想使用递归去写&#xff0c;还是我们要先求出应该有多少层这个很容易&#xff0c;中间输出部分我们算…...

高级语言期末2009级B卷(计算机学院)

1.编写一个名为mystrcpy的函数&#xff0c;实现将字符串str1的偶数位子的字符的拷贝到另一个字符串str2中。并编写主函数&#xff0c;在主函数中从键盘读入一个长度<100的字符串str1&#xff0c;然后调用函数mystrcpy&#xff1b;最后输出str2&#xff0c;例如&#xff0c;读…...

c# using 用法

using命令空间 导入命名空间中的所有类型 如&#xff1a;using System.Text; using别名 using别名包括详细命名空间信息的具体类型&#xff0c;这种做法有个好处就是当同一个cs引用了两个不同的命名空间&#xff0c;但两个命名空间都包括了一个相同名字的类型的时候。当需要…...

【Django】执行查询—跨关系查询中的跨多值关联问题

跨多值查询 跨越 ManyToManyField 或反查 ForeignKey &#xff08;例如从 Blog 到 Entry &#xff09;时&#xff0c;对多个属性进行过滤会产生这样的问题&#xff1a;是否要求每个属性都在同一个相关对象中重合。 filter() 先看filter()&#xff0c;通过一个例子看&#xf…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...