讲师中心 微信公众号
AI工具推荐 视频效率加速

C++实现字符串切割split函数 _ stringstream与find两种方案【实战】

轻雪酱_7340

轻雪酱_7340

发布时间:2026-04-08 19:09:03

|

480人浏览过

|

来源于php中文网

原创

std::stringstream 不适合按任意字符切分,因其默认仅以空白符为分隔且不支持自定义分隔符,如对 "a,b,c" 使用 >> 操作符只能读出整个字符串;推荐用 string::find + substr 手动切分,逻辑清晰、兼容性强、可控性高。

c++实现字符串切割split函数 _ stringstream与find两种方案【实战】

为什么 std::stringstream 不适合按任意字符切分?

它默认以空白符(空格、制表符、换行)为分隔,且无法指定自定义分隔符。比如用 "," 或 "|" 切 "a,b,c",std::stringstream 会把整个字符串当一个 token 读出,根本不会停。

真正能用它的场景仅限:源字符串本身由空格/制表符自然分隔,且你不需要保留空字段。例如解析命令行参数 "arg1 arg2 arg3"(中间多个空格会被自动压缩)。

常见错误现象:std::stringstream ss("a,b,c"); std::string s; while (ss >> s) { ... } 只得到 "a,b,c" 一个结果,不是预期的三个子串。

std::string::find + substr 是最可控的切分方式

手动遍历查找分隔符位置,用 substr 截取,逻辑清晰、无依赖、兼容所有 C++ 标准(C++98 起可用),还能精确控制是否保留空字段。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

  • 用 size_t pos = 0 记录当前搜索起点,循环调用 s.find(delimiter, pos)
  • 每次找到后,用 s.substr(pos, found_pos - pos) 提取字段,再更新 pos = found_pos + delimiter.length()
  • 循环结束后别忘了补最后一段:s.substr(pos)
  • 若需保留连续分隔符产生的空字段(如 "a,,b" → {"a", "", "b"}),不能跳过 found_pos == pos 的情况,要显式 push 空串

示例关键片段:

std::vector<std::string> split(const std::string& s, const std::string& delim) {
    std::vector<std::string> tokens;
    size_t start = 0, end = 0;
    while ((end = s.find(delim, start)) != std::string::npos) {
        tokens.push_back(s.substr(start, end - start));
        start = end + delim.length();
    }
    tokens.push_back(s.substr(start));
    return tokens;
}

用 std::regex 切分看似简洁,但有隐藏代价

写法确实短:std::sregex_iterator 配合 std::regex 可一行切分。但要注意:

  • C++11 引入的 std::regex 在部分标准库实现中性能极差(如旧版 libstdc++),切分长字符串可能慢几个数量级
  • 正则编译开销不可忽略;若反复用同一分隔符切分,应缓存 std::regex 对象,而非每次构造
  • 转义麻烦:切分 "." 得写 R"(\.)",切分 "\" 更是容易出错
  • 不支持“按长度切分”或“最多切 N 段”这类非正则语义的需求

边界情况比想象中多:空字符串、空分隔符、超长分隔符

很多手写的 split 函数在以下输入下崩溃或行为异常:

  • split("", ",") —— 应返回含一个空字符串的 vector,不是空 vector
  • split("abc", "") —— 空分隔符是未定义行为,必须提前检查并报错或抛异常
  • split("abc", "def") —— 分隔符不存在,应返回原始字符串本身
  • split("abbbc", "bb") —— 分隔符重叠("bbb" 中有两个 "bb"),find 方案天然按首次匹配处理,符合直觉;但有些正则模式会因贪婪匹配产生歧义

真正健壮的实现,开头三行就得处理这些分支,而不是等 find 返回 npos 后才兜底。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6419

2023.08.02

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

13846

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

1645

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

3797

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

5961

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2704

2023.09.04

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn