c++oding="utf-8" ?>
substr 是最可控的字符串切分方法;需检查 i 是否越界,substr(i, len) 的 len 表示最多取字符数,不足时自动截断,i 每次递增 len 但须满足 i
用
std::string::substr手动切分最直接没有标准库函数能一键按固定长度切分字符串,
substr是最可控、最不易出错的选择。关键不是“能不能”,而是“怎么避免越界和空段”。常见错误是循环中直接用
i + len当右边界,没检查是否超出str.size(),导致std::out_of_range异常。
- 每次调用
substr(i, len),第二个参数是“最多取多少个”,不是“必须取满”,所以即使剩余字符不足len也不会报错- 起始位置
i每次递增len,但要确保i 才进入循环- 空字符串或
len 需提前处理,否则陷入死循环或未定义行为std::vector<:string> split_by_length(const std::string& s, size_t len) { if (len == 0 || s.empty()) return {}; std::vector<:string> res; for (size_t i = 0; i <h3>用 <code>std::copy_n</code> + <code>std::back_inserter</code> 更适合只读场景</h3> <p>如果你只是想把每段拷贝进 <code>std::string</code>,且不介意多一次内存分配(因为 <code>std::string</code> 构造仍需复制),<code>std::copy_n</code> 可以绕过 <code>substr</code> 的内部长度判断逻辑,性能略高——但差异极小,仅在超长字符串高频调用时值得考虑。</p> <ul> <li> <code>std::copy_n</code> 要求目标容器已预留空间或使用 <code>std::back_inserter</code>,不能直接往空 <code>std::string</code> 写</li> <li>必须确保源迭代器范围有效:<code>s.begin() + i</code> 到 <code>s.begin() + std::min(i + len, s.size())</code> </li> <li>不如 <code>substr</code> 直观,调试时更难一眼看出切分逻辑</li> </ul> <h3>别踩 <code>std::string_view</code> 的生命周期坑</h3> <p>如果原字符串生命周期短,又想避免拷贝,可用 <code>std::string_view</code> 存引用。但必须保证它所指向的 <code>std::string</code> 在所有 <code>string_view</code> 使用完毕前不被销毁。</p> <ul> <li>返回 <code>std::vector<:string_view></:string_view></code> 是可行的,但调用方必须清楚所有权责任</li> <li>不能把临时字符串(如 <code>split_by_length("hello", 2)</code> 中的字面量)传进去再返回 <code>string_view</code>,那会悬垂</li> <li> <code>string_view</code> 的 <code>substr</code> 和 <code>std::string</code> 行为一致,同样安全,但不会隐式转成 <code>std::string</code> </li> </ul> <h3>Python 用户容易误用 <code>std::regex</code> </h3> <p>有人试图用正则(比如 <code>R"((.{1,5}))"</code>)强行匹配固定长度,这完全没必要。正则引擎开销大,且 <code>.</code> 无法正确处理 UTF-8 多字节字符(C++ 标准库 regex 默认按字节匹配),还容易漏掉末尾不足长度的部分。</p> <ul> <li> <code>std::regex</code> 在此场景下既慢又不可靠,纯属过度设计</li> <li>如果真需要模式化切分(比如跳过空格、保留分隔符),再考虑正则;固定长度就是线性扫描的事</li> <li>MSVC 和 libstdc++ 对 <code>std::regex</code> 实现质量不一,跨平台时尤其容易出问题</li> </ul> 实际写的时候,95% 的情况用第一个 <code>substr</code> 版本就够了。最难把握的其实是:要不要允许最后一段“不满也保留”——这取决于业务语义,代码里默认保留,但得让调用方心里有数。</:string></:string>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!












