应先判断字符串长度再截断——若原字符串长度小于目标长度,直接返回原串;否则用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 <p>注意:<code>max_len 是边界条件,否则 <code>substr(0, -3)</code> 会触发无符号整数下溢(<code>size_t</code> 是 unsigned),导致极大偏移量、越界读。</code></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img
src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a>
<p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h3>中文或 UTF-8 多字节字符怎么办</h3><p><code>substr</code> 按字节截,不是按字符。对中文字符串如 <code>"你好世界"</code>(UTF-8 编码占 12 字节),<code>substr(0, 5)</code> 可能切在某个汉字中间,输出乱码。</p>
- 纯 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 库更稳妥。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










