C++【STL】(2)string
C++【STL】string用法扩展
1. assign
:为字符串赋新值
用于替换字符串内容,支持多种参数形式。
常用形式:
// 用另一个字符串赋值
str.assign("Hello World");// 用另一个字符串的子串(从第6个字符开始,取5个字符)
str.assign("Hello World", 6, 5); // 结果:"World"// 用字符数组的前N个字符
str.assign("Hello World", 5); // 结果:"Hello"// 用重复字符填充(重复5次'A')
str.assign(5, 'A'); // 结果:"AAAAA"// 用迭代器范围
std::string tmp = "Hello";
str.assign(tmp.begin(), tmp.end()); // 结果:"Hello"
2. replace
:替换字符串的某一部分
替换指定位置的字符或子串。
常用形式:
std::string str = "Hello World";// 替换从位置6开始的5个字符为"Universe"
str.replace(6, 5, "Universe"); // 结果:"Hello Universe"// 替换迭代器范围内的内容
auto start = str.begin() + 6;
auto end = str.begin() + 11;
str.replace(start, end, "Galaxy"); // 结果:"Hello Galaxy"// 用子串替换(替换前3个字符为"Hi")
str.replace(0, 3, "Hi"); // 结果:"Hilo World"// 用重复字符替换(用3个'!'替换前5个字符)
str.replace(0, 5, 3, '!'); // 结果:"!!! World"
3. find
:查找子串或字符的位置
返回第一个匹配的位置,未找到返回 string::npos
。
常用形式:
std::string str = "Hello World";// 查找子串
size_t pos = str.find("World"); // pos = 6// 查找字符
pos = str.find('W'); // pos = 6// 从指定位置开始查找
pos = str.find('l', 3); // 从位置3开始查找,pos = 3(第一个'l'在位置2,但跳过)// 查找字符集合中任意一个字符
pos = str.find_first_of("aeiou"); // 查找第一个元音,pos = 1('e')// 未找到的示例
if (str.find("Moon") == std::string::npos) {std::cout << "未找到子串";
}
在C++中,std::string::substr
用于从字符串中提取子串。以下是其详细用法和示例:
substr
基本语法
std::string substr(size_t pos = 0, size_t len = npos) const;
- 参数:
pos
:子串的起始位置(默认从0
开始)。len
:子串的长度(默认到字符串末尾)。
- 返回值:新的
std::string
对象,包含提取的子串。
1. 基本提取
std::string str = "Hello World";// 从位置6开始,提取到末尾
std::string sub1 = str.substr(6); // sub1 = "World"// 从位置0开始,提取5个字符
std::string sub2 = str.substr(0, 5); // sub2 = "Hello"// 从位置3开始,提取2个字符
std::string sub3 = str.substr(3, 2); // sub3 = "lo"
2. 处理边界条件
- 如果
pos
超出字符串长度,会抛出std::out_of_range
异常。 - 如果
len
超出剩余字符数,自动截取到字符串末尾。
std::string str = "Hello";std::string sub1 = str.substr(2, 10); // sub1 = "llo"(len超出实际长度)
// std::string sub2 = str.substr(10); // 抛出异常:pos超出范围
3. 结合 find
动态截取
std::string str = "user@example.com";// 查找 '@' 的位置,提取用户名
size_t at_pos = str.find('@');
if (at_pos != std::string::npos) {std::string username = str.substr(0, at_pos); // username = "user"
}// 提取域名部分
std::string domain = str.substr(at_pos + 1); // domain = "example.com"
c_str()
std::string::c_str() 是一个成员函数,用于将 std::string 对象的内容转换为 C风格字符串(即以空字符 \0 结尾的字符数组)。兼容C语言
#include <string>
#include <cstdio> // 用于 printfint main() {std::string str = "Hello World";const char* cstr = str.c_str();// 与C函数交互(如 printf)printf("C字符串内容: %s\n", cstr); // 输出: Hello Worldreturn 0;
}
getline
- 从标准输入读取一行
#include <iostream>
#include <string>int main() {std::string line;std::cout << "请输入一行文本:";std::getline(std::cin, line);std::cout << "你输入的内容是:" << line << std::endl;return 0;
}
输出示例:
请输入一行文本:Hello C++ World
你输入的内容是:Hello C++ World
2. 自定义分隔符
#include <sstream>
#include <string>int main() {std::string data = "Apple,Orange,Banana";std::istringstream iss(data);std::string fruit;// 按逗号分隔读取while (std::getline(iss, fruit, ',')) {std::cout << "水果:" << fruit << std::endl;}return 0;
}
输出:
水果:Apple
水果:Orange
水果:Banana
3. 混合使用 >> 和 getline
int main() {int age;std::string name;std::cout << "请输入年龄:";std::cin >> age; // 输入后缓冲区残留换行符// 清除残留的换行符std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');std::cout << "请输入姓名:";std::getline(std::cin, name); // 正确读取完整姓名(含空格)std::cout << "年龄:" << age << ",姓名:" << name << std::endl;return 0;
}
相关文章:
C++【STL】(2)string
C【STL】string用法扩展 1. assign:为字符串赋新值 用于替换字符串内容,支持多种参数形式。 常用形式: // 用另一个字符串赋值 str.assign("Hello World");// 用另一个字符串的子串(从第6个字符开始,取5…...

嵌入式学习笔记 - STM32 ADC,多重转换,内部参考电压,过采样,逐次逼近原理,采样时间
一 多个ADC器件,多重转换速率 每个型号MCU通常由多个ADC器件,比如STM32F4有三个ADC器件,每个ADC器件有一个最大转换速率,一般为2.4Mhz,即一个ADC器件每秒最多转换2.4M次,两次转换之间需要有时间间隔&#…...

团结引擎 1.5.0 发布,抖音小游戏平台即将开放、Shader Graph功能新增…引擎能力再提升!
「团结引擎 1.5.0」来啦!本次技术更新的内容,涵盖了小游戏、团结引擎车机版、OpenHarmony、Shader Graph、Muse Chat、Hub&License、代码升级、Digital Asset Manager for Tuanjie、团结官方开源车模 Sample 几大方向。 小游戏 在 Tuanjie 1.5.0 版…...
如何下载 Microsoft SQL Server Management Studio 2019
SQL Server Management Studio 是什么,为什么你需要它 SSMS 是 Microsoft 用于管理 SQL Server 环境的主要工具。它为 Windows 用户提供了一个图形用户界面,本质上是数据库管理员和开发人员处理 SQL Server 的指挥中心。重点是——尽管你可能认为它与 SQL Server 捆绑在一起…...
【SSL部署与优化】HTTP/2与HTTPS的协同效应
HTTP/2与HTTPS的协同效应:为何HTTP/2强制要求TLS 1.2? HTTP/2是HTTP协议的现代升级版,旨在通过多路复用、头部压缩等技术提升性能。然而,HTTP/2的设计与部署与HTTPS(TLS加密)紧密相关,甚至强制…...

如何配置activemq,支持使用wss协议连接。
1、到阿里云申请一个证书,通过后下载jks证书。 2、配置activemq: 打开activemq安装目录中“conf/activemq.xml”,增加以下记录: <transportConnectors> <transportConnector name"wss" uri"…...
GO语言内存管理结构
文章目录 1、内存分区1.1、栈(Stack)1.2、堆(Heap) 2、堆内存管理结构2.1、内存分配器(MCache → MArena → MSpan → MHeap)2.2、大小分类(Size Class)2.3、分配流程 3、垃圾回收&a…...

初学c语言14(指针6)
一.sizeof和strlen的对比 1.sizeof 操作符,计算变量所占空间大小 2.strlen 库函数,函数原型为: 求的是字符串的长度,统计的是“\0”之前的字符个数 二.指针和笔试题解析 补充:数组名的意义 1.sizeof(数组名) 这…...

数字化转型-4A架构之技术架构
4A架构系列文章 数字化转型-4A架构(业务架构、应用架构、数据架构、技术架构) 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…...
什么是SparkONYarn模式
1. 什么是 Spark on YARN? Spark on YARN 是 Apache Spark 的一种部署模式,允许 Spark 应用程序在 Hadoop YARN 集群上运行,充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成,使企业能够在同一集群…...

kaggle薅羊毛
参考:https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter05_application/5_1_kaggle/#512-kaggle https://github.com/girls-in-ai/Girls-In-AI/blob/master/machine_learning_diary/data_analysis/kaggle_intro.md 1,code training…...

TCP 三次握手建立连接详解
文章目录 一、三次握手流程1、第一次握手2、第二次握手3、第三次握手 二、引申问题1、报文丢失,会发生什么?1.1、第一次握手丢失1.2、第二次握手丢失1.3、第三次握手丢失 2、为什么 ISN(Initial Sequence Number,初始序列号) 不固定3、为什么…...

高海拔和远距离的人员识别:面部、体型和步态的融合
大家读完就觉得有帮助记得关注和点赞!!! 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别(BRIAR)计划等监视场景中,其中生物识别数据是在长…...
Golang实践录:在go中使用curl实现https请求
之前曾经在一个 golang 工程调用 libcur 实现 https的请求,当前自测是通过的。后来迁移到另一个小系统出现段错误,于是对该模块代码改造,并再次自测。 问题提出 大约2年前,在某golang项目使用libcurl进行https请求(参…...

自然语言处理入门级项目——文本分类
文章目录 前言1.数据预处理1.1数据集介绍1.2数据集抽取1.3划分数据集1.4数据清洗1.5数据保存 2.样本的向量化表征2.1词汇表2.2向量化2.3自定义数据集2.4备注 结语 前言 本篇博客主要介绍自然语言处理领域中一个项目案例——文本分类,具体而言就是判断评价属于积极还…...
如何利用大模型对文章进行分段,提高向量搜索的准确性?
利用大模型对文章进行分段以提高向量搜索准确性,需结合文本语义理解、分块策略优化以及向量表示技术。以下是系统性的解决方案: 一、分块策略的核心原则 语义完整性优先 分块需确保每个文本单元在语义上独立且完整。研究表明,当分块内容保持单一主题时,向量嵌入的语义表征能…...

一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(上)
概述 各位似秃非秃小码农们都知道,在 SwiftUI 中视图是状态的函数,这意味着状态的改变会导致界面被刷新。 但是,对于有些复杂布局的 SwiftUI 视图来说,它们的界面并不能直接映射到对应的状态上去。这就会造成一个问题࿱…...
深入理解 Dijkstra 算法:原理、实现与优化
算法核心思想 Dijkstra算法采用贪心策略,其核心思想可以概括为: 初始化:设置起点到自身的距离为0,到其他所有点的距离为无穷大 迭代处理: 从未处理的顶点中选择当前距离起点最近的顶点 标记该顶点为已处理 通过该顶…...
Postman中https和http的区别是什么?
作为每天与API打交道的测试工程师,理解HTTP与HTTPS的区别不仅关乎协议本身,更直接影响测试方案设计。本文将用测试视角揭示二者在Postman中的关键差异,并分享实战排查技巧。 一、协议层本质差异(测试工程师需要知道的底层原理) 1. 安全传输机制对比 特性HTTPHTTPS加密方…...

软件设计师-下午题-试题4(15分)
目录 1 回溯法 1.1 N皇后问题 1.1.1 非递归求解N皇后问题 1.1.2 递归求解N皇后问题 1.2 真题 2 分治法 2.1 真题 3 动态规划法 3.1 0-1背包问题 3.2 真题 1 回溯法 1.1 N皇后问题 上图Q4与Q2在同一列且与Q1在同一斜线,先回溯到上一个皇后改变Q3皇后的位置…...
《隐私计算:数据安全与隐私保护的新希望》
一、引言 在数字化时代,数据已成为企业和组织的核心资产。然而,数据的收集、存储和使用过程中面临着诸多隐私和安全挑战。隐私计算作为一种新兴技术,旨在解决数据隐私保护和数据共享之间的矛盾。本文将深入探讨隐私计算的基本概念、技术原理、…...

leetcode二叉树相关题目复习(C语言版)
目录 1.单值二叉树 2.相同的树 3.对称二叉树 4.二叉树的前序遍历 5.另一颗树的子树 1.单值二叉树 思路1: 判断根节点、左节点与右节点的值是否相等,因为正向判断(即判断三值相等返回true)比较麻烦(不能根节点满足…...

第十九次博客打卡
今天学习的内容是Java中的常见循环。 在 Java 中,常见的循环结构主要有以下几种:for 循环、while 循环、do-while 循环以及增强型 for 循环(也称为 for-each 循环)。 1. for 循环 for 循环是一种非常灵活的循环结构,…...
【Pandas】pandas DataFrame describe
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...
机器人示教操作
机器人基础操作 **ES机器人试教操作知识** **1. 视角移动** **1.1 基础模式** - 关节轴控制:通过关节1至关节6实现单轴正反转移动 - 直线移动:通过X/Y/Z坐标轴沿指定方向直线移动 - 旋转移动:通过RX/RY/RZ坐标轴绕指定轴旋转 **1.2 步进模式…...

浅聊一下数据库的索引优化
背景 这里的索引说的是关系数据库(MSSQL)中的索引。 本篇不是纯技术性的内容,只是聊一次性能调优的经历,包含到一些粗浅的实现和验证手段,所以,大神忽略即可。 额…对了,笔者对数据库的优化手段…...

山东大学软件学院软件工程计算机图形学复习笔记(2025)
写在前面: 现在是考完试的第二天,考试的内容还是有一部分没有复习到的…… 根据三角形的3个顶点坐标和内部某点坐标D,写出点D的基于面积的权重坐标Bresenham的算法描述与改进策略(这里ppt上很不清晰)以及直线反走样的…...

【Docker】Docker Compose方式搭建分布式内存数据库(Redis)集群
文章目录 开发环境开发流程运行效果Docker Desktop桌面中的Redis结点启动图Redis结点1的打印日志情况图 配置代码命令行启动配置文件: README.md删除集群信息新建数据目录本地Redis的结点的域名,并添加到/etc/hosts文件的末尾域名映射启动集群结点创建集群关闭集群结点 redis-c…...

如何在 Bash 中使用 =~ 操作符 ?
在 Bash 脚本世界中,有各种操作符可供我们使用,使我们能够操作、比较和测试数据。其中一个操作符是 ~ 操作符。这个操作符经常被忽视,但功能非常强大,它为我们提供了一种使用正则表达式匹配字符串模式的方法。 ~ 操作符语法 语法…...

科学养生指南:打造健康生活
在快节奏的现代生活中,健康养生成为人们关注的焦点。科学养生无需复杂理论,掌握以下几个关键要素,就能为身体构筑坚实的健康防线。 合理饮食是健康的基础。世界卫生组织建议,每天应摄入至少 5 份蔬菜和水果,保证维生…...