深入解析 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++ 字符串处理的精髓,并在实际项目中灵活运用这些方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/963205.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

赛博算卦之周易六十四卦JAVA实现:六幺算尽天下事,梅花化解天下苦。

佬们过年好呀~新年第一篇博客让我们来场赛博算命吧&#xff01; 更多文章&#xff1a;个人主页 系列文章&#xff1a;JAVA专栏 欢迎各位大佬来访哦~互三必回&#xff01;&#xff01;&#xff01; 文章目录 #一、文化背景概述1.文化起源2.起卦步骤 #二、卦象解读#三、just do i…

「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)

深度学习&#xff08;DL&#xff09;是现代人工智能&#xff08;AI&#xff09;的核心之一&#xff0c;但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用&#xff0c;深度学习经历了几乎一个世纪的不断探索与发展。今天&#xff0c;我们一起回顾深度学习的历史…

AIGC技术中常提到的 “嵌入转换到同一个向量空间中”该如何理解

在AIGC&#xff08;人工智能生成内容&#xff09;技术中&#xff0c;“嵌入转换到同一个向量空间中”是一个核心概念&#xff0c;其主要目的是将不同类型的输入数据&#xff08;如文本、图像、音频等&#xff09;映射到一个统一的连续向量空间中&#xff0c;从而实现数据之间的…

单细胞分析基础-第一节 数据质控、降维聚类

scRNA_pipeline\1.Seurat 生物技能树 可进官网查询 添加链接描述 分析流程 准备:R包安装 options("repos"="https://mirrors.ustc.edu.cn/CRAN/") if(!require("BiocManager")) install.packages("BiocManager",update = F,ask =…

【13】WLC HA介绍和配置

1.概述 本文对AireOS WLC的HA进行介绍,和大多数网络架构设计一样,单台的WLC是无法保证设备的冗余性的,而且WLC也不是双引擎的设备,所以需要依靠High Available的技术来为WLC提供高可用性。 2.WLC HA类型 AireOS WLC的高可用性技术可以分为N+1的SSO的HA。不是所有的设备都…

Alibaba开发规范_编程规约之命名风格

文章目录 命名风格的基本原则1. 命名不能以下划线或美元符号开始或结束2. 严禁使用拼音与英文混合或直接使用中文3. 类名使用 UpperCamelCase 风格&#xff0c;但以下情形例外&#xff1a;DO / BO / DTO / VO / AO / PO / UID 等4. 方法名、参数名、成员变量、局部变量使用 low…

【Elasticsearch 基础入门】Centos7下Elasticsearch 7.x安装与配置(单机)

Elasticsearch系列文章目录 【Elasticsearch 基础入门】一文带你了解Elasticsearch&#xff01;&#xff01;&#xff01;【Elasticsearch 基础入门】Centos7下Elasticsearch 7.x安装与配置&#xff08;单机&#xff09; 目录 Elasticsearch系列文章目录前言单机模式1. 安装 J…

Gurobi基础语法之 addConstr, addConstrs, addQConstr, addMQConstr

在新版本的 Gurobi 中&#xff0c;向 addConstr 这个方法中传入一个 TempConstr 对象&#xff0c;在模型中就会根据这个对象生成一个约束。更重要的是&#xff1a;TempConstr 对象可以传给所有addConstr系列方法&#xff0c;所以下面先介绍 TempConstr 对象 TempConstr TempC…

深度学习可视化指标方法工具

1. TensorBoard 简介&#xff1a;由TensorFlow提供的可视化工具&#xff0c;现已支持多种深度学习框架。 功能&#xff1a; 图可视化&#xff1a;展示计算图结构&#xff0c;帮助理解模型架构。 标量仪表板&#xff1a;跟踪损失和准确率等指标的变化。 直方图仪表板&#xf…

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具01

1、开发背景 大家都很熟悉&#xff0c;Oracle提供了Impdp和ExpDp工具&#xff0c;功能很强大&#xff0c;可以进行db的导入导出的处理。但是对于Sqlserver数据库只是提供了简单的图形化的导出导入工具&#xff0c;在实际的开发和生产环境不太可能让用户在图形化的界面选择移行…

小程序-视图与逻辑

前言 1. 声明式导航 open-type"switchTab"如果没有写这个&#xff0c;因为是tabBar所以写这个&#xff0c;就无法跳转。路径开始也必须为斜线 open-type"navigate"这个可以不写 现在开始实现后退的效果 现在我们就在list页面里面实现后退 2.编程式导航…

list的使用,及部分功能的模拟实现(C++)

目录&#xff08;文章中"节点"和"结点"是同一个意思&#xff09; 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list…

StarRocks BE源码编译、CLion高亮跳转方法

阅读SR BE源码时&#xff0c;很多类的引用位置爆红找不到&#xff0c;或无法跳转过去&#xff0c;而自己的Linux机器往往缺乏各种C依赖库&#xff0c;配置安装比较麻烦&#xff0c;因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器&#xff0c;进行编…

Axure PR 9 旋转效果 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…

Java - 引用类型:强引用、软引用、弱引用和虚引用详解

文章目录 概述1. 强引用&#xff08;Strong Reference&#xff09;1.1 什么是强引用&#xff1f;1.2 强引用的特点1.3 强引用的使用场景1.4 强引用的注意事项 2. 软引用&#xff08;Soft Reference&#xff09;2.1 什么是软引用&#xff1f;2.2 软引用的特点2.3 软引用的使用场…

S4 HANA给科目分配允许记账的税码

本文主要介绍在S4 HANA OP中给科目分配允许记账的税码相关设置。具体请参照如下内容&#xff1a; 1. 给科目分配允许记账的税码 以上配置定义了总账科目可以使用什么税码进行记账。通常在科目主数据中会明确总账科目的“Tax Category”来请明确总账科目可以使用什么类型的税码…

xss-labs靶场

xss-labs靶场 xss攻击类型 反射型xss 即攻击者将恶意脚本嵌入到url或者表单中&#xff0c;当用户访问特定的url或者提交表单时&#xff08;用户端请求时)&#xff0c;恶意脚本会执行 攻击需要用户点击恶意链接或访问包含恶意参数的url触发 存储型xss 即攻击者将恶意脚本提交…

CVE-2024-23897-Jenkins任意文件读取漏洞复现

content Jenkins是什么CVE-2024-23897总结修复建议 Jenkins是什么 Jenkins是一人基于Java开发的、可扩展的持续集成引擎&#xff0c;用于持续、自动地构建/测试软件项目&#xff0c;可以监控一些定时执行的任务。 官网文档&#xff1a; Jenkins是一款开源 CI&CD 软件&…

解析 Oracle 中的 ALL_SYNONYMS 和 ALL_VIEWS 视图:查找同义词与视图的基础操作

目录 前言1. ALL_SYNONYMS 视图2. ALL_VIEWS 视图3. 扩展 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. ALL_SYNONYMS 视图 在 Oracle 数据库中&#xff0c;同义词&#xff08;Synonym&#xff09;是对数…

30.Word:设计并制作新年贺卡以及标签【30】

目录 NO1.2 NO3邮件合并-信函 NO4邮件合并-标签​ NO1.2 另存为/F12&#xff1a;考生文件夹&#xff1a;Word.docx布局→页面设置对话框→页边距&#xff1a;上下左右→纸张&#xff1a;宽度/高度&#xff08;先调页边距&#x1f197;&#xff09;设计→页面颜色→填充效果→…