第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 只是起到快速建立大体架构的作用,里面会涉…...
【论文笔记】Visual Instruction Tuning
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Visual Instruction Tunin…...
ubuntu 设置静态IP
一、 ip addresssudo nano /etc/netplan/50-cloud-init.yaml 修改前: 修改后: # This file is generated from information provided by the datasource. Changes # to it will not persist across an instance reboot. To disable cloud-inits # ne…...
Java 每日一刊(第19期):泛型
文章目录 前言1. 泛型概述1.1 不使用泛型 vs 使用泛型1.2 泛型的作用 2. 泛型的基本语法2.1 定义带类型参数的泛型类2.2 使用泛型类2.3 泛型方法 3. 泛型类型推断与钻石操作符3.1 类型推断3.2 钻石操作符 4. 通配符的使用4.1 无界通配符 <?>4.2 上界通配符 <? exten…...
windows下安装rabbitMQ并开通管理界面和允许远程访问
如题,在windows下安装一个rabbitMQ server;然后用浏览器访问其管理界面;由于rabbitMQ的默认账号guest默认只能本机访问,因此需要设置允许其他机器远程访问。这跟mysql的思路很像,默认只能本地访问,要远程访…...
深度剖析音频剪辑免费工具的特色与优势
是热爱生活的伙伴或者想要记录美好声音的普通用户,都可能会需要对音频进行剪辑处理。而幸运的是,现在有许多优秀的音频剪辑软件提供了免费版本,让我们能够轻松地施展音频剪辑的魔法。接下来,就让我们一同深入了解这些音频剪辑免费…...
Oracle中TRUNC()函数详解
文章目录 前言一、TRUNC函数的语法二、主要用途三、测试用例总结 前言 在Oracle中,TRUNC函数用于截取或截断日期、时间或数值表达式的部分。它返回一个日期、时间或数值的截断版本,根据提供的格式进行截取。 一、TRUNC函数的语法 TRUNC(date) TRUNC(d…...
【Spring Boot 入门一】构建你的第一个Spring Boot应用
一、引言 在当今的软件开发领域,Java一直占据着重要的地位。而Spring Boot作为Spring框架的延伸,为Java开发者提供了一种更加便捷、高效的开发方式。它简化了Spring应用的搭建和配置过程,让开发者能够专注于业务逻辑的实现。无论是构建小型的…...
PPT 快捷键使用、技巧
前言: 本文操作是以office 2021为基础的,仅供参考;不同版本office 的 ppt 快捷键 以及对应功能会有差异,需要实践出真知。 shift 移动 水平/垂直 移动 ; shift 放大/缩小 等比例放大 缩小 ; 正圆 正…...
Web安全 - 文件上传漏洞(File Upload Vulnerability)
文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…...
vue3中el-input在form表单按下回车刷新页面
摘要: 在input框中点击回车之后不是调用我写的回车事件,而是刷新页面! 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 ,并设置style“display:none” <ElInput style"display…...
可以直接进入网站的正能量没封的/湘潭seo公司
https://studio.zerobrane.com/doc-remote-debugging.html...
做的烂的大网站/可以免费发布广告的平台有哪些
wxaParse/css.js / page-frame vv.js...
篮球网站设计/阿里巴巴国际站关键词推广
Math.ceil()向上舍入 123alert(Math.ceil(20.1)) //输出 21alert(Math.ceil(20.5)) //输出 21alert(Math.ceil(20.9)) //输出 21Math.round标准的四舍五入 123alert(Math.round(20.1)) //输出 20alert(Math.round(20.5)) //输出 21alert(Math.round(20.9)) //输出 21Math.floor…...
嘉定做网站/焦作seo推广
希望有大神能够有所指导啊。还是有点不是很了解,下面是自己调试代码的一些体验过程。 #include <ioCC2530.h> #include <string.h>#define uint unsigned int#define uchar unsigned char#define time 10uint i,k,p;//定义LED的端口#define r P1_…...
网站服务器ip地址怎么查/武汉seo首页优化报价
01背包问题。 题意是说 你必须窃取银行,除此之外,你会被拘捕一定几率,再就是N银行。每个银行都有一定数额的钱。此外,还有会被抓住的概率。 计算不能赶上偷钱。 只是非常阴险一道题。说得是被抓的概率。你须要算逃跑的概率 然后 &…...
网站文字编辑怎么做/专业做网站官网
摘要:本节介绍各种SQL语句。本节介绍有关数据库级的SQL以及相关操作,查看、建立和删除等操作。从本节开始正式介绍各种SQL语句。本节介绍有关数据库级的SQL以及相关操作,查看、建立和删除等操作。用SHOW显示已有的数据库句法:SHOW…...