word_wrap的核心约束是单词不拆分、空格为分隔符、每行≤max_width;超长单词独占一行;正确做法为逐词贪心拼接,避免substr硬切;需考虑utf-8安全、性能优化及locale感知空白符。

什么是 word_wrap 的核心约束条件
自动单词折行不是简单按字符数切分,而是必须保证:单词不被拆开、空格作为自然分隔符、每行长度 ≤ 指定宽度(max_width)。如果某个单词本身比 max_width 还长,它只能独占一行——这是多数真实场景(如终端输出、GUI 文本框)的共识行为,不是 bug。
常见错误是直接用 std::string::substr 每 max_width 个字符截一次,结果把 “internationalization” 切成 “inter…”,这违反语义。正确做法是逐词扫描,用空格定位边界。
用 std::istringstream + 贪心拼接实现基础版
这是最直观、不易出错的实现方式:把输入按空格拆成词,维护当前行字符串,逐个尝试加入下一个词(加空格后总长是否超限)。
- 若当前行为空,直接放入第一个词
- 否则检查
current_line.length() + 1 + next_word.length() (+1 是空格) - 不满足就 push 当前行,重置
current_line = next_word - 注意处理末尾非空的
current_line,别漏掉最后一行
std::vector<:string> word_wrap(const std::string& text, size_t max_width) {
std::vector<:string> lines;
std::istringstream iss(text);
std::string word, line;
while (iss >> word) {
if (line.empty()) {
line = word;
} else if (line.length() + 1 + word.length()
<h3>遇到超长单词时怎么不卡死或崩溃</h3>
<p>上面代码在 <code>word.length() > max_width</code> 时会把该词直接塞进 <code>line</code>,导致单行超宽——这本身符合要求,但需明确告知调用方:这不是失败,是故意为之。更健壮的做法是提前检测并可选启用「强制折断」逻辑(比如对日志系统),但必须加开关控制:</p>
<ul>
<li>默认行为:保留完整单词,单行超出 <code>max_width</code>
</li>
<li>可选参数 <code>bool force_break = false</code>,启用后对超长词调用 <code>word.substr(i, max_width)</code> 分段</li>
<li>强制折断时注意:不能在 UTF-8 多字节字符中间切,C++ 标准库不自带 UTF-8 安全切分,若需支持中文等,得先用 <code>std::mbrtowc</code> 或第三方库定位码点边界</li>
</ul>
<h3>性能敏感场景下避免频繁字符串拼接</h3>
<p>高频调用(如渲染循环中)时,反复 <code>line += " " + word</code> 会触发多次内存分配。可用 <code>std::vector<:string_view></:string_view></code> 先存词引用,最后统一计算长度并构造结果:</p>
<ul>
<li>遍历词时只记录 <code>std::string_view</code> 和累计长度(含空格)</li>
<li>发现要换行时,用 <code>std::string(reserve(total_length))</code> 预分配,再用 <code>append</code> 拼接</li>
<li>若输入是临时 <code>std::string</code> 且允许移动,传参改用 <code>std::string&&</code> 避免拷贝</li>
</ul>
<p>真正容易被忽略的是:不同 locale 下空格判定可能不止 ASCII 空格(比如 Unicode 不间断空格 <code>\u00A0</code>),<code>std::istringstream</code> 默认只认 <code>' '</code>、<code>'\t'</code>、<code>'\n'</code>。需要支持更多空白符时,得手写 tokenizer 或用 <code>std::iswspace</code> 配合 <code>wstring</code>。</p></:string></:string>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











