C++中std::string::substr怎么截取字符串_C++字符串切片操作指南【备忘】-C++

substr的第一个参数是起始索引(从0开始,越界抛异常),第二个参数是最多复制的字符数(非结束下标,超长自动截断);负数索引需手动转为正向等效位置。

substr 的两个参数到底是什么意思

很多人以为 substr 是“起始位置 + 长度”,但容易忽略第二个参数是「最多取多少个字符」,不是「截到哪个下标」。它不会自动停在字符串末尾之外——如果越界,C++11 起会自动截断到 size(),不抛异常(但传负数或极大值可能触发未定义行为)。

常见错误:写成 s.substr(3, 10) 以为能安全取“第3位之后的10个”,结果 s 只有5个字符,实际拿到的是 s[3]..s[4] 共2个——这没错,但若逻辑依赖“一定拿到10个”,就会出错。

  • 第一个参数 pos:从 0 开始的索引,超出 size() 时抛 std::out_of_range
  • 第二个参数 count:要复制的字符数,std::string::npos 表示“到末尾”
  • 推荐写法:s.substr(pos, std::min(count, s.size() - pos))(手动保底),或直接用 s.substr(pos) 省得算

用 substr 实现类似 Python 的负数切片

C++ 标准库不支持负数下标,但你可以快速补一个等效逻辑:把负的起始位置转成正的。比如 s[-3:] 在 Python 中取后3个字符,在 C++ 里就是 s.substr(s.size() >= 3 ? s.size() - 3 : 0)。

注意边界:当 s.size() 时,s.size() - 3 是很大的无符号数(size_t),直接传给 substr 会越界崩溃。必须先判断。

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

  • 安全取后 n 个:n
  • 安全取从倒数第 a 个到倒数第 b 个(类似 s[-a:-b]):先转正下标,再检查是否合法,最后调 substr
  • 别用 static_cast(s.size()) 去减——size() 是无符号类型,转 int 可能溢出

substr 性能问题:它真的只是视图吗

不是。substr 返回的是新 std::string,会分配内存、拷贝字符。它不是像 std::string_view 那样的零开销视图。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中std::string::substr怎么截取字符串_C++字符串切片操作指南【备忘】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4009176+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4009177+
  • 本周更新: 0+
  • 最后更新: 2026-03-16