substr直接截取易越界崩溃,须先判长:若len

截断逻辑怎么写才不越界
直接用 substr 截取容易崩溃——如果原字符串长度小于指定长度,substr(pos, len) 会抛出 std::out_of_range。必须先判断长度再操作。
- 先用
str.length()获取真实长度 - 若
len ,才调用 <code>str.substr(0, len) - 否则直接返回原串,避免异常
省略号该加在哪儿、加几个字符
中文环境里一个省略号是 "…"(U+2026,占 3 字节 UTF-8),英文常用 "..."(3 ASCII 字节)。但「指定长度」通常指显示宽度,而 C++ 的 std::string::length() 返回的是字节数,不是字符数或视觉宽度。所以:
- 若只处理 ASCII 字符,用
"..."安全,长度计算一致 - 若含中文,且要求「最多显示 n 个字符」,需用 ICU 或手动 UTF-8 解码——否则
"你好…"可能被截成"你好…"后面多出半个汉字(乱码) - 更稳妥的做法:预留 3 字节给
"...",即截取长度为std::min(len, static_cast<size_t>(3)) ? 0 : len - 3</size_t>
封装成可复用的函数要注意什么
常见错误是把省略号硬编码进函数,导致无法适配不同语言或 UI 风格。推荐用参数控制:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
std::string truncate(const std::string& s, size_t max_len, const std::string& ellipsis = "...") {
if (s.length()
- 检查
max_len 是关键,否则 <code>substr会越界 - 不要用
s.size()替代s.length(),虽等价但语义上length()更明确 - 传入的
ellipsis必须是合法 UTF-8,否则拼接后可能损坏编码
在 Qt 或 ImGui 里直接用要小心编码
Qt 的 QString 和 ImGui 的文本渲染都按 Unicode 字符处理,而 std::string 是字节序列。如果从 std::string 构造 QString 再截断,得先确保源数据是 UTF-8:
- Qt:用
QString::fromUtf8(s.c_str()),再用left()+"…"(注意用 U+2026) - ImGui:直接传 UTF-8 字节流即可,但
ellipsis必须也是 UTF-8,比如"\xe2\x80\xa6" - Windows 控制台默认是 GBK,
"…"会显示为乱码——此时要么切换控制台代码页,要么改用"..."
真正麻烦的从来不是截断本身,而是你根本不确定输入字符串到底是什么编码,以及目标显示环境怎么解释它。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










