截断逻辑必须先判断原始长度再操作:若字符串长度小于等于最大长度,直接返回原串;否则截取前max_len-3位并添加省略号。

截断逻辑必须先判断原始长度再操作
直接对 std::string 调用 substr() 截到固定长度,但若原字符串更短,会触发 std::out_of_range 异常。安全做法是先比较长度:if (s.length() 。否则才考虑截断+补省略号。注意:省略号本身占字符数(如 <code>"..." 是 3 字节),所以实际可保留的正文长度是 max_len - 3,且该值必须 ≥ 0 —— 否则连省略号都放不下,此时应直接返回截断到 max_len 的部分(不加省略号)。
中文、emoji 场景下不能只看 length()
std::string::length() 返回的是字节数,不是 Unicode 字符数。一个中文汉字通常占 3 字节(UTF-8),一个 emoji 可能占 4 字节。若按字节截断,可能把一个 UTF-8 多字节字符从中劈开,导致后续显示为乱码或 。解决方法:用 std::u8string(C++20)或第三方库(如 ICU、utf8cpp)做真正的字符计数;若暂不升级,至少在截断前校验末尾是否为合法 UTF-8 序列(例如检查最后 1–3 字节是否构成完整字符)。常见错误是直接 s.substr(0, max_len - 3) 后拼 "...",结果在中文里截出半个“你”字。
std::string::substr() 的起始位置和长度参数易错
substr(pos, len) 中 pos 是起始索引(从 0 开始),len 是要取的字符数(字节!)。容易犯的错包括:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 把
len写成目标总长(比如想截 10 字符却传10,没减去省略号长度) - 传负数或超界
pos(如s.substr(s.length(), 1)在空串时崩溃) - 忽略
len为 0 时返回空串,而非原串
size_t safe_len = std::min(max_len > 3 ? max_len - 3 : 0, s.length());,再 s.substr(0, safe_len) + (safe_len 。<h3>性能敏感场景需避免重复构造临时字符串</h3>
<p>频繁调用截断函数(如日志渲染、UI 刷新)时,每次 <code>substr() + operator+ 都会分配新内存。可改用就地修改:先 resize() 原字符串(若允许修改),再手动填充省略号;或用 std::string_view 做只读视图,仅在真正需要输出时才构造结果。另外,省略号建议定义为常量:constexpr const char* ELLIPSIS = "...";,避免每次拼接都生成新字面量对象。
立即学习“C++免费学习笔记(深入)”;
实际使用中,最常被忽略的是 UTF-8 边界检查 —— 它不会报错,但会在某些设备上静默显示异常符号。宁可少截一个字,也不要截出半个字符。

















