第9课-C++String功能的探索
1:C 语言中的字符串 vs C++ string 类
1.1 C 语言中的字符串
在 C 语言中,字符串本质上是以 \0 结尾的字符数组。C 标准库为此提供了 str 系列函数,如 strlen()、strcpy() 和 strcat() 等。虽然这些函数可以操作字符串,但它们的操作十分繁琐且容易出错,尤其是在内存管理方面。
例如,在 C 语言中进行字符串拼接的代码如下:
#include <stdio.h>
#include <string.h>int main() {char str1[50] = "Hello";char str2[50] = " World";// 字符串连接strcat(str1, str2);printf("%s\n", str1);  // 输出:Hello Worldreturn 0;
}
问题:C 语言中的字符串操作容易出现内存溢出,因为需要手动管理字符数组的长度。
1.2 C++ string 类的优势
C++ 中的 string 类使得字符串操作更加安全和简便。它封装了复杂的内存管理,并提供了类似数组的接口,开发者不再需要手动管理字符串的长度和内存。例如,使用 string 进行字符串拼接:
#include <iostream>
#include <string>
using namespace std;int main() {string str1 = "Hello";string str2 = " World";// 使用 += 操作符进行拼接str1 += str2;cout << str1 << endl;  // 输出:Hello Worldreturn 0;
}2:string 类的构造与基础操作
2.1 string 类的构造方法
string 类支持多种构造方式,以下是常见的构造函数:
函数名 功能描述
string() 默认构造一个空字符串
string(const char* s) 使用 C 字符串 s 构造 string 对象
string(size_t n, char c) 构造一个包含 n 个字符 c 的字符串
string(const string& s) 使用已有的 string 对象进行拷贝构造
2.1.1 示例代码:构造字符串
#include <iostream>
#include <string>
using namespace std;int main() {string s1;                 // 空字符串string s2("Hello C++");     // 通过C字符串初始化string s3(s2);              // 拷贝构造string s4(5, 'A');          // 5个'A'字符的字符串cout << "s1: " << s1 << endl;cout << "s2: " << s2 << endl;cout << "s3: " << s3 << endl;cout << "s4: " << s4 << endl;return 0;
}输出示例:
s1: 
 s2: Hello C++
 s3: Hello C++
 s4: AAAAA
2.2 string 对象的常见操作
函数名 功能描述
size() 返回字符串的长度
length() 返回字符串的长度,与 size() 等价
capacity() 返回当前分配的存储空间大小
empty() 判断字符串是否为空,若为空返回 true
clear() 清空字符串内容
reserve() 为字符串预留存储空间,不改变有效字符的个数
resize() 改变字符串的长度,若增大则用默认字符填充
2.2.1:字符串容量操作
注意:size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
clear()只是将string中有效字符清空,不改变底层空间大小。
resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不 同的是当字符个数增多时:resize(n)用'\0'来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小。
 size和capacity都不包括’\0’
#include <iostream>
#include <string>
using namespace std;int main() {string s = "Hello";cout << "Size: " << s.size() << endl;     // 返回字符串长度cout << "Capacity: " << s.capacity() << endl;  // 返回容量s.resize(10, 'X');                        // 将长度改为10,多出部分用'X'填充cout << "Resized: " << s << endl;s.clear();                                // 清空字符串cout << "Is empty: " << s.empty() << endl;  // 检查是否为空return 0;
}输出示例:
Size: 5
 Capacity: 15
 Resized: HelloXXXXX
 Is empty: 1
2.3 字符串的遍历与访问
可以通过以下几种方式访问字符串中的字符:
方法 功能描述
operator[] 返回或设置指定位置的字符
at() 返回指定位置的字符并进行边界检查
begin()/end() 返回字符串的首尾迭代器,用于遍历字符串
rbegin()/rend() 返回反向迭代器,支持从后向前遍历字符串
push_back() 在字符串末尾追加一个字符
append() 在字符串末尾追加另一个字符串或子字符串
注意:
在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
2.3.1 遍历与访问字符
#include <iostream>
#include <string>
using namespace std;int main() {string s = "Hello C++";// 使用下标访问cout << "First character: " << s[0] << endl;// 使用迭代器遍历for (auto it = s.begin(); it != s.end(); ++it) {cout << *it << ' ';}cout << endl;return 0;
}输出示例
First character: H
H e l l o C + +
3:字符串的高级操作
3.1 字符串的查找操作
string 类提供了多种查找子字符串或字符的方法。常见的查找方法如下:
函数名 功能说明
find() 在字符串中查找子字符串或字符,返回其首次出现的位置,找不到则返回 string::npos
rfind() 反向查找字符串,返回最后一次出现子串或字符的位置
find_first_of() 查找指定字符集中的任意一个字符,返回第一次出现的索引
find_last_of() 查找指定字符集中的任意一个字符,返回最后一次出现的索引
string::npos 是 std::string 类的一个常量静态成员变量,它是用来表示查找操作失败时的返回值。它通常等于无符号整数类型的最大值(size_t(-1)),具体值是实现定义的,但它在所有实现中都用于表示“未找到”的状态。
#include <iostream>
#include <string>
using namespace std;int main() {cout << "Value of string::npos: " << string::npos << endl;return 0;
}输出结果:
Value of string::npos: 18446744073709551615 // 这是 size_t 的最大值 (通常等于 -1)
3.1.1 查找子字符串
#include <iostream>
#include <string>
using namespace std;int main() {string s = "Hello World";// 查找 "World" 在字符串中的位置size_t pos = s.find("World");if (pos != string::npos) {cout << "'World' found at position: " << pos << endl;} else {cout << "'World' not found" << endl;}// 反向查找 'o'size_t rpos = s.rfind('o');cout << "'o' last found at position: " << rpos << endl;return 0;
}输出示例:
'World' found at position: 6
'o' last found at position: 7
3.1.2 示例代码:查找任意字符
#include <iostream>
#include <string>
using namespace std;int main() {string s = "Hello, World!";string charset = "aeiou";  // 查找元音字母// 使用 find_first_of 查找字符集中任意字符第一次出现的位置size_t first_pos = s.find_first_of(charset);if (first_pos != string::npos) {cout << "First vowel in the string found at position: " << first_pos << endl;} else {cout << "No vowel found in the string." << endl;}// 使用 find_last_of 查找字符集中任意字符最后一次出现的位置size_t last_pos = s.find_last_of(charset);if (last_pos != string::npos) {cout << "Last vowel in the string found at position: " << last_pos << endl;} else {cout << "No vowel found in the string." << endl;}return 0;
}输出示例:
First vowel in the string found at position: 1
Last vowel in the string found at position: 8
3.3 字符串的比较操作
在 C++ 中,string 类支持字符串的比较操作,既可以使用运算符 ==、!=、<、> 等,也可以通过 compare() 方法进行更细粒度的比较。
方法 功能说明
operator== 判断两个字符串是否相等
operator!= 判断两个字符串是否不相等
operator< 判断当前字符串是否小于另一个字符串
operator> 判断当前字符串是否大于另一个字符串
compare() 进行详细的字符串比较,返回 0 表示相等,负值表示小于,正值表示大于
3.2.1 :字符串比较
#include <iostream>
#include <string>
using namespace std;int main() {string str1 = "Apple";string str2 = "Banana";if (str1 == str2) {cout << "Strings are equal" << endl;} else {cout << "Strings are not equal" << endl;}// 使用 compare() 方法比较int result = str1.compare(str2);if (result == 0) {cout << "Strings are equal" << endl;} else if (result < 0) {cout << "str1 is less than str2" << endl;} else {cout << "str1 is greater than str2" << endl;}return 0;
}输出示例:
Strings are not equal
str1 is less than str2
3.3字符串的替换操作
在 C++ 中,string 类允许我们通过 replace() 方法替换字符串中的部分内容。
函数名    功能说明
 replace()    替换从指定位置开始的若干字符为新字符串
3.3.1 替换字符串中的部分内容
#include <iostream>
#include <string>
using namespace std;int main() {string str = "Hello World";// 替换 "World" 为 "C++"str.replace(6, 5, "C++");cout << str << endl;  // 输出:Hello C++return 0;
}输出示例:
Hello C++
3.4 字符串的截取操作
string 类提供了 substr() 方法来提取字符串中的子字符串。该方法非常有用,尤其是在处理文件路径或URL时。
函数名 功能说明
substr() 从指定位置开始,截取若干字符并返回子字符串
3.4.1提取子字符串
#include <iostream>
#include <string>
using namespace std;int main() {string str = "Hello World";// 从位置 6 开始截取 5 个字符string sub = str.substr(6, 5);cout << "Substring: " << sub << endl;return 0;
}输出示例:
Substring: World
3.5字符串的插入与删除操作
在 C++ 中,string 类支持通过 insert() 在字符串的指定位置插入子字符串,或通过 erase() 从指定位置删除字符。
这两个方法因为时间复杂度挺高的,所以还是避免常用
函数名 功能说明
insert() 在字符串的指定位置插入字符或子字符串
erase() 删除字符串中指定位置的若干字符
3.5.1 插入与删除操作
#include <iostream>
#include <string>
using namespace std;int main() {string str = "Hello World";// 在索引 5 处插入一个逗号str.insert(5, ",");cout << "After insert: " << str << endl;// 删除索引 5 开始的 1 个字符str.erase(5, 1);cout << "After erase: " << str << endl;return 0;
}输出示例:
After insert: Hello, World
After erase: Hello World
3.6 字符串与数值的转换
C++ 提供了 to_string() 和 stoi() 等函数,帮助我们在字符串和数值之间进行转换。这在处理用户输入、文件解析等场景中非常常用。
函数名    功能说明
 to_string()    将数值转换为字符串
 stoi()    将字符串转换为整数
 stof()    将字符串转换为浮点数
3.6.1 数字与字符串的相互转换
#include <iostream>
#include <string>
using namespace std;int main() {int num = 42;string str = to_string(num);  // 数字转字符串cout << "String: " << str << endl;string strNum = "123";int parsedNum = stoi(strNum);  // 字符串转整数cout << "Parsed Integer: " << parsedNum << endl;return 0;
}输出示例:
String: 42
Parsed Integer: 123
相关文章:
第9课-C++String功能的探索
1:C 语言中的字符串 vs C string 类 1.1 C 语言中的字符串 在 C 语言中,字符串本质上是以 \0 结尾的字符数组。C 标准库为此提供了 str 系列函数,如 strlen()、strcpy() 和 strcat() 等。虽然这些函数可以操作字符串,但它们的操…...
 
基于Hive和Hadoop的保险分析系统
本项目是一个基于大数据技术的保险分析系统,旨在为用户提供全面的汽车保险信息和深入的保险价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…...
 
国庆节快乐前端(HTML+CSS+JavaScript+BootStrap.min.css)
一、效果展示 二、制作缘由 最近,到了国庆节,自己呆在学校当守校人,太无聊了,顺便做一个小demo帮祖国目前庆生!!! 三、项目目录结构 四、准备工作 (1)新建好对应的文件目录 为了方便ÿ…...
 
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化 阿里 MySQL 命名规范MySQL8 DDL的原子化 阿里 MySQL 命名规范 【强制】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价…...
PyTorch源码系列(一)——Optimizer源码详解
目录 1. Optimizer类2. Optimizer概览3. 源码解析3.1 构造方法3.1.1 全局设置情形3.1.2 局部设置情形3.1.3 覆盖测试3.1.4 逐行讲解 3.2 add_param_group3.3 step3.4 zero_grad3.5 self.state3.6 state_dict3.7 load_state_dict 4. SGD Optimizer5. 极简版Optimizer源码6. 自定…...
Java - LeetCode面试经典150题(三)
区间 228. 汇总区间 题目 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中…...
 
基于SpringBoot+Vue+MySQL的民宿预订平台
系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着旅游业的蓬勃发展,民宿作为一种独特的住宿方式,受到了越来越多游客的青睐。然而,传统的民宿预定方式往往存在信息不对称、效率低下等问题,难以满足游客的个性化需…...
Hadoop krb5.conf 配置详解
krb5.conf文件是Kerberos认证系统中的一个关键配置文件,它包含了Kerberos的配置信息,如KDC(Key Distribution Centers)和Kerberos相关域的管理员服务器位置、当前域和Kerberos应用的默认设置、以及主机名与Kerberos域的映射等。以…...
工程师 - DNS请求过程
DNS(Domain Name System,域名系统)是互联网的重要基础设施之一,其主要功能是将人们容易记忆的域名(例如 www.example.com)转换为计算机能识别的IP地址(例如 192.0.2.1),类…...
Solidity智能合约中的事件和日志
1. Solidity 中的事件和日志概述 1.1 什么是事件? 在 Solidity 中,事件(Event)是一种允许智能合约与外部世界进行通信的机制。通过触发事件,可以记录合约执行中的关键操作,并将这些操作发送到链上。事件的…...
第四十一篇-Docker安装Neo4j
创建目录 mkdir /opt/neo4j-data创建 docker run \ -d --name neo4j \ -p 7474:7474 -p 7687:7687 \ -v /opt/neo4j-data/data:/data \ -v /opt/neo4j-data/logs:/logs \ -v /opt/neo4j-data//conf:/var/lib/neo4j/conf \ -v /opt/neo4j-data/plugins:/plugins \ --env NEO4J…...
 
数电基础(组合逻辑电路+Proteus)
1.组合逻辑电路 1.1组合逻辑电路的分析 1.1.1组合逻辑电路的定义 组合逻辑电路的定义 (1)对于一个逻辑电路,其输出状态在任何时刻只取决于同一时刻的输入状态,而与电路的原来状态无关,这种电路被定义为组合逻辑电路…...
 
自给自足:手搓了一个睡眠监测仪,用着怎么样?
很久不分享手搓党作品拉! 今天分享一个“基于毫米波雷达的睡眠监测仪”作品! 用Air700E开发板毫米波雷达,手搓一个开箱即用的睡眠监测仪,不花冤枉钱! 来仔细瞧瞧! 一、项目原理及硬件制作 毫米波是指频率…...
 
Miniforge详细安装教程(macOs和Windows)
(注:主要是解决商业应用anaconda收费问题,这是轻量级的代替,个人完全可以使用anaconda和miniconda) Miniforge 是一个轻量级的包管理器,类似于 Anaconda 和 Miniconda。它主要用于安装基于 conda 的 Python 环境,专注于…...
HDFS Shell作业1
1.在HDFS上建立/user/stu/自己学号,和/user/stu/input目录。 命令: hdfs dfs -mkdir -p /user/stu/22 hdfs dfs -mkdir /user/stu/input 2.用两种不同的方法上传albums.csv至HDFS的学号目录和input目录中。 命令: hdfs dfs -put par…...
 
工业交换机一键重启的好处
在当今高度自动化和智能化的工业环境中,工业交换机作为网络系统中至关重要的一环,其稳定性和可靠性直接影响到整个生产过程的顺利进行。为了更好地维护这些设备的健康运行,一键重启功能应运而生,并呈现出诸多显著的好处。 首先&am…...
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
全文目录: 前言一、PL/SQL基础语法1.1 变量声明变量声明示例: 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表(嵌套表)嵌套表的定义与使用 3.2 关联数组关联数组…...
 
springboot系列--web相关知识探索二
一、映射 指的是与请求处理方法关联的URL路径,通过在Spring MVC的控制器类(使用RestController注解修饰的类)上使用注解(如 RequestMapping、GetMapping)来指定请求映射路径,可以将不同的HTTP请求映射到相应…...
 
Oracle 12c在Windows环境下安装
适合初学者使用的Oracle 12c在Windows环境下安装步骤、参数配置、常见问题及参数调优的详细补充说明。 一、Oracle 12c安装步骤 1. 准备工作 在安装Oracle 12c之前,确保你的系统满足以下要求: 操作系统:Oracle 12c支持的Windows版本包括Wi…...
 
Stable Diffusion绘画 | 来训练属于自己的模型:打标处理与优化
上一篇完成的打标工作,是为了获取提示词,让AI认识和学习图片的特征。 因此,合适、恰当、无误的提示词,对最终模型效果是相当重要的。 Tag 如何优化 通过软件自动生成的 Tag 只是起到快速建立大体架构的作用,里面会涉…...
 
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
 
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
 
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
 
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
 
qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类,直接把源文件拖进VS的项目里,然后VS卡住十秒,然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分,导致编译的时候找不到了。因…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
 
CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…...
 
STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...
 
7种分类数据编码技术详解:从原理到实战
在数据分析和机器学习领域,分类数据(Categorical Data)的处理是一个基础但至关重要的环节。分类数据指的是由有限数量的离散值组成的数据类型,如性别(男/女)、颜色(红/绿/蓝)或产品类…...
