0

0

c++中如何实现字符串分割_c++字符串分割方法

尼克

尼克

发布时间:2026-01-08 16:07:02

|

617人浏览过

|

来源于php中文网

原创

std::stringstream 适合单一分隔符且格式规范的场景,自动跳过空白;需用 getline 指定分隔符,仅支持单字符;多字符分隔用 find+substr 更可控;复杂模式才用 std::regex。

c++中如何实现字符串分割_c++字符串分割方法

std::stringstream 按空格或固定分隔符切分最简单

适合分隔符单一、不需保留空字段、且输入格式较规范的场景。它本质是把字符串当“流”读,自动跳过连续空白,所以对多个空格、首尾空格都健壮。

常见错误是误以为它能按任意字符(如 ",")分割——其实默认只认空白。要改分隔符得配合 std::getline 手动指定:

std::string s = "apple,banana,cherry";
std::vector tokens;
std::string token;
std::istringstream tokenStream(s);
while (std::getline(tokenStream, token, ',')) {
    tokens.push_back(token);
}
  • 注意:如果原串末尾有逗号(如 "a,b,"),std::getline 会生成空字符串 "",需自行判断是否过滤
  • 分隔符只能是单个 char,不能是子串(比如 "::" 就不行)
  • 不修改原字符串,内存开销小,适合中小规模数据

std::string::find + substr 实现任意子串分隔

当分隔符是多字符(如 " | ")、或需要精确控制空字段处理时,这是最直接可控的方式。核心是循环查找分隔符位置,截取中间内容。

容易踩的坑是边界条件:找不到分隔符时 find 返回 std::string::npos,直接传给 substr 会抛异常;还有末尾残留未处理子串常被忽略。

立即学习C++免费学习笔记(深入)”;

PodLM
PodLM

PodLM是一款强大的AI播客生成工具

下载
std::string s = "one::two::three::";
std::string delimiter = "::";
std::vector tokens;
size_t start = 0;
size_t end = s.find(delimiter);
while (end != std::string::npos) {
    tokens.push_back(s.substr(start, end - start));
    start = end + delimiter.length();
    end = s.find(delimiter, start);
}
tokens.push_back(s.substr(start)); // 处理最后一段
  • 若想跳过空字段(如 "a:::b" 中间两个冒号产生的空串),在 push_back 前加 if (!token.empty())
  • 每次 find 都从新位置开始,避免重复匹配重叠分隔符(如分隔符为 "aa",字符串为 "aaaa"
  • 性能上比 stringstream 稍低,但可控性强,无第三方依赖

std::regex 处理复杂模式(如多种分隔符或忽略引号内分隔)

真正需要“智能分割”时才用,比如 CSV 解析(逗号分隔但引号内逗号不算)、混合空格/制表符/中文顿号等。正则强大,但也更重、更易出错。

典型问题是过度设计:简单空格分割硬套 std::regex,结果性能差还难调试。另外 C++11 的 std::regex 在部分旧编译器(如 GCC

std::string s = "a, b, \"c,d\", e";
std::regex re(R"(([^",\s]+)|\"([^\"]*)\")");
std::sregex_iterator it(s.begin(), s.end(), re);
std::sregex_iterator end;
while (it != end) {
    std::smatch match = *it;
    std::string token = match[1].str().empty() ? match[2].str() : match[1].str();
    tokens.push_back(token);
    ++it;
}

  • 正则表达式本身难写难读,建议先用在线工具(如 regex101)验证逻辑
  • std::regex 构造开销大,应复用 std::regex 对象而非每次重建
  • Windows 上 MSVC 对 std::regex 支持较好,Linux 下 GCC 推荐用 boost::regex 或换用 std::string_view + 手写解析

现代 C++(C++17 起)用 std::string_view 避免拷贝

如果只是遍历分割结果、不修改内容,用 std::string_view 替代 std::string 存储子串,能彻底避免内存分配和拷贝,尤其对长字符串或高频调用场景收益明显。

关键点在于:所有子串必须保证其指向的原始字符串生命周期长于 string_view 对象本身,否则就是悬垂指针。

std::string source = "hello|world|cpp";
std::vector views;
size_t start = 0;
size_t pos = source.find('|');
while (pos != std::string::npos) {
    views.push_back(std::string_view(source).substr(start, pos - start));
    start = pos + 1;
    pos = source.find('|', start);
}
views.push_back(std::string_view(source).substr(start)); // 最后一段
  • 不能对 string_view 调用 data() 后直接传给 C 函数(如 printf),除非确保以 '\0' 结尾
  • 没有 find 方法,得转成 std::string 或用 std::search 等算法
  • std::string::find 组合使用时,注意 string_viewsubstr 返回仍是 string_view,不会触发拷贝

实际项目里,80% 的字符串分割需求用 std::string::find + substr 就够了,清晰、可控、无依赖。别一上来就堆正则或模板元编程——多数时候只是让调用方更难读懂,也更难改。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

247

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

733

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

211

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

349

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

231

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

527

2023.12.06

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

59

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.8万人学习

Git 教程
Git 教程

共21课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号