应先判断字符串长度再截断——若原字符串长度小于目标长度,直接返回原串;否则用substr截取前max_len个字符,避免抛出std::out_of_range异常。

截断逻辑怎么写才不越界
直接用 substr 截取容易崩溃——如果原字符串长度小于指定长度,substr(pos, len) 会抛出 std::out_of_range。必须先判断长度再操作。
- 先用
str.length()获取真实长度,和目标最大显示长度(比如max_len)比较 - 若
str.length() ,直接返回原串 - 若超长,只取前
max_len - 3个字符,再拼接"...";注意这里减 3 是为省略号留位,否则可能显示成"abc..."超过限制
C++11 及以上推荐的简洁实现
用 std::string 的构造和 append 避免多次临时对象生成,比字符串拼接更高效:
std::string truncate_with_ellipsis(const std::string& str, size_t max_len) {
if (max_len < 3) return str.substr(0, max_len); // 连"..."都放不下,不加省略号
if (str.length() <= max_len) return str;
return str.substr(0, max_len - 3) + "...";
}注意:max_len 是边界条件,否则 <code>substr(0, -3) 会触发无符号整数下溢(size_t 是 unsigned),导致极大偏移量、越界读。
中文或 UTF-8 多字节字符怎么办
substr 按字节截,不是按字符。对中文字符串如 "你好世界"(UTF-8 编码占 12 字节),substr(0, 5) 可能切在某个汉字中间,输出乱码。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
立即学习“C++免费学习笔记(深入)”;
- 纯 ASCII 场景可直接用上述方案
- 含中文/emoji 时,需用 UTF-8 解码库(如
utf8cpp)或手动遍历字节判断字符边界 - 简单规避法:改用宽度控制(如用
std::wstring+mbstowcs转宽字符),但需注意平台 locale 设置
要不要支持自定义省略符
硬编码 "..." 不灵活。实际项目中常需支持 "…"(Unicode 水平省略号)、"[...]" 或空字符串。
- 把省略符作为参数传入,类型用
const std::string& ellipsis = "..." - 计算截取长度时改为
max_len >= ellipsis.length() ? max_len - ellipsis.length() : 0 - 务必检查
ellipsis是否为空,避免负数偏移
最麻烦的其实是多字节字符 + 自定义省略符 + 宽度限制三者叠加——这时候别硬写,引入成熟 Unicode 库更稳妥。

















