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

深入解析 C++ 字符串处理:提取和分割的多种方法

在 C++ 编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时。本文将详细探讨如何使用 C++ 标准库中的工具(如 std::istringstreamstd::string 的成员函数)来提取和分割字符串,并分析不同方法的适用场景和优缺点。我们将通过多个示例代码逐步讲解,帮助读者掌握字符串处理的技巧。


1. 字符串提取的基本方法

1.1 使用 std::istringstream>> 操作符

std::istringstream 是 C++ 标准库中的一个类,它将字符串作为输入流来处理。通过 >> 操作符,我们可以从流中提取以空格分隔的单词或数字。

示例代码
#include <iostream>
#include <sstream>
#include <string>int main() {std::string s = "id13 id1 id6 id0 id8 id6 id0";std::istringstream iss(s);std::string token;while (iss >> token) {std::cout << token << std::endl;}return 0;
}

输出

id13
id1
id6
id0
id8
id6
id0
分析
  • iss >> token 会按空格分隔字符串,逐个提取单词。

  • 这种方法适用于字符串中的单词是用空格分隔的简单场景。


1.2 提取 id 后面的数字

如果需要从类似 "id13 id1 id6" 的字符串中提取 id 后面的数字,可以使用 std::string::substr 方法。

示例代码
#include <iostream>
#include <sstream>
#include <string>
#include <vector>int main() {std::string s = "id13 id1 id6 id0 id8 id6 id0";std::istringstream iss(s);std::string token;std::vector<int> ids;while (iss >> token) {if (token.substr(0, 2) == "id") {int id = std::stoi(token.substr(2));ids.push_back(id);}}for (int id : ids) {std::cout << id << std::endl;}return 0;
}
输出
13
1
6
0
8
6
0
分析
  • token.substr(2)token 的第 2 个字符开始提取子串,跳过 "id"

  • 无论 id 后面的数字是一位数、两位数还是三位数,substr(2) 都能正确提取。

  • 这种方法简洁高效,适用于提取固定前缀后的数字。


2. 处理复杂分隔符

2.1 使用 std::getline 自定义分隔符

如果字符串的分隔符不是空格(例如逗号 , 或分号 ;),可以使用 std::getline 并指定分隔符。

示例代码
#include <iostream>
#include <sstream>
#include <string>
#include <vector>int main() {std::string s = "id13,id1,id6,id0,id8,id6,id0";std::istringstream iss(s);std::string token;std::vector<int> ids;while (std::getline(iss, token, ',')) {if (token.substr(0, 2) == "id") {int id = std::stoi(token.substr(2));ids.push_back(id);}}for (int id : ids) {std::cout << id << std::endl;}return 0;
}
输出
13
1
6
0
8
6
0
分析
  • std::getline(iss, token, ',') 会按逗号分隔字符串,逐个提取单词。

  • 这种方法适用于处理自定义分隔符的场景。


2.2 处理多行输入

如果输入是多行的,std::getline 也可以按行提取内容。

示例代码
#include <iostream>
#include <sstream>
#include <string>int main() {std::string s = "id13 id1 id6\nid0 id8 id6\nid0";std::istringstream iss(s);std::string line;while (std::getline(iss, line)) {std::istringstream lineStream(line);std::string token;while (lineStream >> token) {std::cout << token << std::endl;}}return 0;
}
输出
id13
id1
id6
id0
id8
id6
id0
分析
  • 外层 std::getline 按行提取内容。

  • 内层 lineStream >> token 按空格分隔每行的单词。

  • 这种方法适用于处理多行输入的场景。


3. 高级字符串处理技巧

3.1 使用正则表达式

C++11 引入了 <regex> 库,支持正则表达式匹配,可以更灵活地处理字符串。

示例代码
#include <iostream>
#include <regex>
#include <string>
#include <vector>int main() {std::string s = "id13 id1 id6 id0 id8 id6 id0";std::regex pattern(R"(id(\d+))");std::smatch matches;std::vector<int> ids;auto words_begin = std::sregex_iterator(s.begin(), s.end(), pattern);auto words_end = std::sregex_iterator();for (std::sregex_iterator i = words_begin; i != words_end; ++i) {std::smatch match = *i;int id = std::stoi(match.str(1));ids.push_back(id);}for (int id : ids) {std::cout << id << std::endl;}return 0;
}
输出
13
1
6
0
8
6
0
分析
  • 使用正则表达式 R"(id(\d+))" 匹配 id 后面的数字。

  • 这种方法功能强大,但语法较复杂,适合处理复杂的字符串匹配任务。


3.2 性能优化

对于大规模数据处理,性能可能成为瓶颈。可以通过以下方法优化:

  1. 避免频繁创建和销毁 std::istringstream 对象。

  2. 使用 std::string_view(C++17)减少字符串拷贝。

示例代码
#include <iostream>
#include <sstream>
#include <string>
#include <vector>int main() {std::string s = "id13 id1 id6 id0 id8 id6 id0";std::istringstream iss(s);std::string token;std::vector<int> ids;ids.reserve(10); // 预分配空间while (iss >> token) {if (token.substr(0, 2) == "id") {int id = std::stoi(token.substr(2));ids.push_back(id);}}for (int id : ids) {std::cout << id << std::endl;}return 0;
}
分析
  • 预分配 ids 的空间可以减少动态内存分配的开销。

  • 使用 std::string_view 可以避免不必要的字符串拷贝。


4. 总结

本文详细介绍了 C++ 中字符串提取和分割的多种方法,包括:

  1. 使用 std::istringstream>> 操作符按空格分隔字符串。

  2. 使用 std::getline 处理自定义分隔符和多行输入。

  3. 使用正则表达式处理复杂的字符串匹配任务。

  4. 通过性能优化技巧提高代码效率。

每种方法都有其适用的场景和优缺点,开发者可以根据具体需求选择合适的方法。掌握这些技巧后,你将能够高效地处理各种字符串任务,提升代码的可读性和性能。


通过本文的学习,希望读者能够深入理解 C++ 字符串处理的精髓,并在实际项目中灵活运用这些方法。

相关文章:

深入解析 C++ 字符串处理:提取和分割的多种方法

在 C 编程中&#xff0c;字符串处理是一个常见的任务&#xff0c;尤其是在需要从字符串中提取特定数据时。本文将详细探讨如何使用 C 标准库中的工具&#xff08;如 std::istringstream 和 std::string 的成员函数&#xff09;来提取和分割字符串&#xff0c;并分析不同方法的适…...

计算机组成原理——存储系统(一)

在人生的道路上&#xff0c;成功与失败交织成一幅丰富多彩的画卷。不论我们是面对胜利的喜悦&#xff0c;还是遭遇失败的痛苦&#xff0c;都不能放弃对梦想的追求。正是在这种追求中&#xff0c;我们不断地超越自我&#xff0c;不断地突破自己的极限。只有勇往直前&#xff0c;…...

Jenkins未在第一次登录后设置用户名,第二次登录不进去怎么办?

Jenkins在第一次进行登录的时候&#xff0c;只需要输入Jenkins\secrets\initialAdminPassword中的密码&#xff0c;登录成功后&#xff0c;本次我们没有修改密码&#xff0c;就会导致后面第二次登录&#xff0c;Jenkins需要进行用户名和密码的验证&#xff0c;但是我们根本就没…...

论文和代码解读:RF-Inversion 图像/视频编辑技术

Diffusion Models专栏文章汇总:入门与实战 前言:Rectified Flow的反演和DDIM这些不太一样,上一篇博客中介绍了腾讯提出的一种方法《基于Rectified Flow FLUX的图像编辑方法 RF-Solver》,主要就是用泰勒展开和一阶导数近似来分解反演公式。这篇博客介绍谷歌提出的方法RF-Inv…...

大模型培训讲师老师叶梓分享:DeepSeek多模态大模型janus初探

以下视频内容为叶梓分享DeepSeek多模态大模型janus的部署&#xff0c;并验证其实际效果&#xff0c;包括图生文和文生图两部分。 叶梓老师人工智能培训分享DeepSeek多模态大模型janus初探 DeepSeek 的多模态大模型 Janus 是一款强大的 AI 模型&#xff0c;专注于图像和文本的多…...

2025最新源支付V7全套开源版+Mac云端+五合一云端

2025最新源支付V7全套开源版Mac云端五合一云端 官方1999元&#xff0c; 最新非网上那种功能不全带BUG开源版&#xff0c;可以自己增加授权或二开 拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题 它基于…...

稀疏混合专家架构语言模型(MoE)

注&#xff1a;本文为 “稀疏混合专家架构语言模型&#xff08;MoE&#xff09;” 相关文章合辑。 手把手教你&#xff0c;从零开始实现一个稀疏混合专家架构语言模型&#xff08;MoE&#xff09; 机器之心 2024年02月11日 12:21 河南 选自huggingface 机器之心编译 机器之心…...

比较热门的嵌入式项目

嵌入式系统在现代科技中应用广泛&#xff0c;以下是一些当前比较热门的嵌入式项目方向及其应用场景&#xff1a; 1. 物联网&#xff08;IoT&#xff09; 智能家居&#xff1a;智能灯光、温控器、安防系统。环境监测&#xff1a;空气质量、温湿度、土壤湿度传感器。工业物联网&…...

牛客网 除2!(详解)c++

题目链接&#xff1a;除2&#xff01; 1.题目解析 1&#xff1a;想让数组所有数之和尽可能小&#xff0c;肯定有个想法&#xff0c;就是我每次选数组中偶数的时候&#xff0c;我必定挑一个最大的&#xff0c;因为我挑一个最大的出来&#xff0c;把它变成一半&#xff0c;这个时…...

被裁与人生的意义--春节随想

还有两个月就要被迫离开工作了十多年的公司了&#xff0c;不过有幸安安稳稳的过了一个春节&#xff0c;很知足! 我是最后一批要离开的&#xff0c;一百多号同事都没“活到”蛇年。看着一批批仁人志士被“秋后斩首”&#xff0c;马上轮到我们十来个&#xff0c;个中滋味很难言清…...

ASP.NET Core 中间件

目录 一、常见的内置中间件 二、自定义中间件 三、中间件的执行顺序 四、其他自动逸中间件案例 1. 身份验证中间件 2、跨域中间件&#xff08;CORS&#xff09; ASP.NET Core 中&#xff0c;中间件&#xff08;Middleware&#xff09;是处理 HTTP 请求和响应的组件链。你…...

Pyecharts之图表样式深度定制

在数据可视化的世界里&#xff0c;图表的样式定制对于提升数据展示效果和用户体验至关重要。Pyecharts 提供了丰富的样式定制功能&#xff0c;能让我们创建出独具特色的可视化作品。本篇将深入探讨如何使用 Pyecharts 为图表添加线性渐变色、径向渐变色&#xff0c;以及如何添加…...

git笔记-简单入门

git笔记 git是一个分布式版本控制系统&#xff0c;它的优点有哪些呢&#xff1f;分为以下几个部分 与集中式的版本控制系统比起来&#xff0c;不用担心单点故障问题&#xff0c;只需要互相同步一下进度即可。支持离线编辑&#xff0c;每一个人都有一个完整的版本库。跨平台支持…...

Joplin 插件在Vscode中无法显示图片

1.问题 在vscode里面装好joplin插件之后&#xff0c;无法显示图片内容。 粘贴的图片可以再vscode中显示&#xff0c;无法再joplin客户端显示 2.解决方法 这种情况是因为和vscode自带的MD编辑器的预览模式有冲突&#xff0c;或者没用通过专用方式上传图片。 方法一&#xff…...

python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算

【0】基础定义 按位与运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;全1取1&#xff0c;其余取0。按位或运算&#xff1a;两个等长度二进制数上下对齐&#xff0c;有1取1&#xff0c;其余取0。 按位取反运算&#xff1a;一个二进制数&#xff0c;0变1,1变0。 【1】…...

pandas分组

分组 分组的关键要素是&#xff1a; 分组依据、数据来源、操作及其返回结果。 df.groupby(分组依据)[数据来源].使用操作对学生按照性别统计身高中位数。 print(df.groupby(Gender)[Height].median())上面是一维度进行分组&#xff0c;如果要根据多个维度分组&#xff0c;则…...

爬虫基础(三)Session和Cookie讲解

目录 一、前备知识点 &#xff08;1&#xff09;静态网页 &#xff08;2&#xff09;动态网页 &#xff08;3&#xff09;无状态HTTP 二、Session和Cookie 三、Session 四、Cookie &#xff08;1&#xff09;维持过程 &#xff08;2&#xff09;结构 正式开始说 Sessi…...

【Super Tilemap Editor使用详解】(十三):快捷键指南(Keyboard Shortcuts)

在使用 Super Tilemap Editor 进行图块地图编辑时&#xff0c;键盘快捷键可以显著提高工作效率。本文将详细介绍常用的快捷键及其功能&#xff0c;帮助你更快地完成图块绘制、翻转、旋转以及工具切换等操作。 一、快捷键文件位置 所有键盘快捷键的定义可以在以下路径找到&…...

【Leetcode 每日一题】119. 杨辉三角 II

问题背景 给定一个非负索引 r o w I n d e x rowIndex rowIndex&#xff0c;返回「杨辉三角」的第 r o w I n d e x rowIndex rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 数据约束 0 ≤ r o w I n d e x ≤ 33 0 \le rowIndex \le 33 …...

简单看看会议系统2(时延分析)(TODO)

&#xff08;TODO&#xff09; eBPF (extended Berkeley Packet Filter) 可以用来跟踪和分析树莓派 5 或其他 Linux 系统中的各种活动&#xff0c;包括拍摄和数据传输过程的性能分析。eBPF 是一个强大的内核级工具&#xff0c;可以在不修改内核源码的情况下&#xff0c;动态地跟…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...