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<std::string> word_wrap(const std::string& text, size_t max_width) {
std::vector<std::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() <= max_width) {
line += " " + word;
} else {
lines.push_back(line);
line = word;
}
}
if (!line.empty()) lines.push_back(line);
return lines;
}
遇到超长单词时怎么不卡死或崩溃
上面代码在 word.length() > max_width 时会把该词直接塞进 line,导致单行超宽——这本身符合要求,但需明确告知调用方:这不是失败,是故意为之。更健壮的做法是提前检测并可选启用「强制折断」逻辑(比如对日志系统),但必须加开关控制:
立即学习“C++免费学习笔记(深入)”;
- 默认行为:保留完整单词,单行超出
max_width - 可选参数
bool force_break = false,启用后对超长词调用word.substr(i, max_width)分段 - 强制折断时注意:不能在 UTF-8 多字节字符中间切,C++ 标准库不自带 UTF-8 安全切分,若需支持中文等,得先用
std::mbrtowc或第三方库定位码点边界
性能敏感场景下避免频繁字符串拼接
高频调用(如渲染循环中)时,反复 line += " " + word 会触发多次内存分配。可用 std::vector<std::string_view> 先存词引用,最后统一计算长度并构造结果:
- 遍历词时只记录
std::string_view和累计长度(含空格) - 发现要换行时,用
std::string(reserve(total_length))预分配,再用append拼接 - 若输入是临时
std::string且允许移动,传参改用std::string&&避免拷贝
真正容易被忽略的是:不同 locale 下空格判定可能不止 ASCII 空格(比如 Unicode 不间断空格 \u00A0),std::istringstream 默认只认 ' '、'\t'、'\n'。需要支持更多空白符时,得手写 tokenizer 或用 std::iswspace 配合 wstring。


















