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

第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&#xff1a;C 语言中的字符串 vs C string 类 1.1 C 语言中的字符串 在 C 语言中&#xff0c;字符串本质上是以 \0 结尾的字符数组。C 标准库为此提供了 str 系列函数&#xff0c;如 strlen()、strcpy() 和 strcat() 等。虽然这些函数可以操作字符串&#xff0c;但它们的操…...

基于Hive和Hadoop的保险分析系统

本项目是一个基于大数据技术的保险分析系统&#xff0c;旨在为用户提供全面的汽车保险信息和深入的保险价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 Spark…...

国庆节快乐前端(HTML+CSS+JavaScript+BootStrap.min.css)

一、效果展示 二、制作缘由 最近&#xff0c;到了国庆节&#xff0c;自己呆在学校当守校人&#xff0c;太无聊了&#xff0c;顺便做一个小demo帮祖国目前庆生&#xff01;&#xff01;&#xff01; 三、项目目录结构 四、准备工作 (1)新建好对应的文件目录 为了方便&#xff…...

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化

【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化 阿里 MySQL 命名规范MySQL8 DDL的原子化 阿里 MySQL 命名规范 【强制】表名、字段名必须使用小写字母或数字&#xff0c;禁止出现数字开头&#xff0c;禁止两个下划线中间只出现数字。数据库字段名的修改代价…...

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 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中…...

基于SpringBoot+Vue+MySQL的民宿预订平台

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;民宿作为一种独特的住宿方式&#xff0c;受到了越来越多游客的青睐。然而&#xff0c;传统的民宿预定方式往往存在信息不对称、效率低下等问题&#xff0c;难以满足游客的个性化需…...

Hadoop krb5.conf 配置详解

krb5.conf文件是Kerberos认证系统中的一个关键配置文件&#xff0c;它包含了Kerberos的配置信息&#xff0c;如KDC&#xff08;Key Distribution Centers&#xff09;和Kerberos相关域的管理员服务器位置、当前域和Kerberos应用的默认设置、以及主机名与Kerberos域的映射等。以…...

工程师 - DNS请求过程

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要基础设施之一&#xff0c;其主要功能是将人们容易记忆的域名&#xff08;例如 www.example.com&#xff09;转换为计算机能识别的IP地址&#xff08;例如 192.0.2.1&#xff09;&#xff0c;类…...

Solidity智能合约中的事件和日志

1. Solidity 中的事件和日志概述 1.1 什么是事件&#xff1f; 在 Solidity 中&#xff0c;事件&#xff08;Event&#xff09;是一种允许智能合约与外部世界进行通信的机制。通过触发事件&#xff0c;可以记录合约执行中的关键操作&#xff0c;并将这些操作发送到链上。事件的…...

第四十一篇-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组合逻辑电路的定义 组合逻辑电路的定义 &#xff08;1&#xff09;对于一个逻辑电路&#xff0c;其输出状态在任何时刻只取决于同一时刻的输入状态&#xff0c;而与电路的原来状态无关&#xff0c;这种电路被定义为组合逻辑电路…...

自给自足:手搓了一个睡眠监测仪,用着怎么样?

很久不分享手搓党作品拉&#xff01; 今天分享一个“基于毫米波雷达的睡眠监测仪”作品&#xff01; 用Air700E开发板毫米波雷达&#xff0c;手搓一个开箱即用的睡眠监测仪&#xff0c;不花冤枉钱&#xff01; 来仔细瞧瞧&#xff01; 一、项目原理及硬件制作 毫米波是指频率…...

Miniforge详细安装教程(macOs和Windows)

(注&#xff1a;主要是解决商业应用anaconda收费问题&#xff0c;这是轻量级的代替&#xff0c;个人完全可以使用anaconda和miniconda) Miniforge 是一个轻量级的包管理器&#xff0c;类似于 Anaconda 和 Miniconda。它主要用于安装基于 conda 的 Python 环境&#xff0c;专注于…...

HDFS Shell作业1

1.在HDFS上建立/user/stu/自己学号&#xff0c;和/user/stu/input目录。 命令&#xff1a; hdfs dfs -mkdir -p /user/stu/22 hdfs dfs -mkdir /user/stu/input 2.用两种不同的方法上传albums.csv至HDFS的学号目录和input目录中。 命令&#xff1a; hdfs dfs -put par…...

工业交换机一键重启的好处

在当今高度自动化和智能化的工业环境中&#xff0c;工业交换机作为网络系统中至关重要的一环&#xff0c;其稳定性和可靠性直接影响到整个生产过程的顺利进行。为了更好地维护这些设备的健康运行&#xff0c;一键重启功能应运而生&#xff0c;并呈现出诸多显著的好处。 首先&am…...

滚雪球学Oracle[4.2讲]:PL/SQL基础语法

全文目录&#xff1a; 前言一、PL/SQL基础语法1.1 变量声明变量声明示例&#xff1a; 二、记录类型与集合类型的使用2.1 记录类型记录类型的定义与使用 2.2 集合类型 三、PL/SQL表与关联数组3.1 PL/SQL表&#xff08;嵌套表&#xff09;嵌套表的定义与使用 3.2 关联数组关联数组…...

springboot系列--web相关知识探索二

一、映射 指的是与请求处理方法关联的URL路径&#xff0c;通过在Spring MVC的控制器类&#xff08;使用RestController注解修饰的类&#xff09;上使用注解&#xff08;如 RequestMapping、GetMapping&#xff09;来指定请求映射路径&#xff0c;可以将不同的HTTP请求映射到相应…...

Oracle 12c在Windows环境下安装

适合初学者使用的Oracle 12c在Windows环境下安装步骤、参数配置、常见问题及参数调优的详细补充说明。 一、Oracle 12c安装步骤 1. 准备工作 在安装Oracle 12c之前&#xff0c;确保你的系统满足以下要求&#xff1a; 操作系统&#xff1a;Oracle 12c支持的Windows版本包括Wi…...

Stable Diffusion绘画 | 来训练属于自己的模型:打标处理与优化

上一篇完成的打标工作&#xff0c;是为了获取提示词&#xff0c;让AI认识和学习图片的特征。 因此&#xff0c;合适、恰当、无误的提示词&#xff0c;对最终模型效果是相当重要的。 Tag 如何优化 通过软件自动生成的 Tag 只是起到快速建立大体架构的作用&#xff0c;里面会涉…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...