折行需先确认单词边界,避免空格分割风险;宽度计算须区分ascii与中文/emoji;超长单词需按码点强制拆分;结果用vector存储;windows控制台需处理cr/lf。

折行前先确认单词边界怎么切
直接用空格切分 std::string 很危险:连续空格、首尾空格、制表符或换行符都会让 std::istringstream 或 std::string::find_first_of(" ") 丢词或产生空 token。更稳妥的是用 std::isalnum() + 手动扫描,或者用 std::regex 匹配 \w+(但性能差,小字符串可接受)。实际项目中建议先 trim 再按空白字符分割,用 std::regex_token_iterator 或第三方库如 absl::StrSplit 更可靠。
宽度计算不能只看字符数
中文、Emoji、全角标点占位是 ASCII 字符的 2 倍(在等宽字体下),而 C++ 标准库不提供内置字宽测量。常见做法是:对每个 char32_t 调用 u_charWidth()(ICU 库)或查 Unicode EastAsianWidth 属性;轻量级方案是用 utf8cpp 解码后对 U+4E00–U+9FFF、U+3400–U+4DBF 等区间做粗略判断。若只处理英文,可直接按字符数算,但一旦混入中文,line.length() 就完全不可信。
贪心折行时要防止单词超长溢出
如果一个单词本身宽度 > 目标行宽(比如超长 URL 或 base64),不折会撑破布局,硬折又破坏语义。必须提前检测:对每个单词调用宽度函数,若 > max_width,就按字符(不是字节!)强制拆分,每段加软连字符 "-" 或直接截断。注意 UTF-8 下不能按 std::string::substr(0, n) 截,得用 utf8::next() 步进到合法码点边界。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
std::vector<:string></:string>存单词,避免反复构造临时std::string - 折行结果存
std::vector<:string></:string>而非拼接成大字符串,方便后续渲染对齐 - 传入的
max_width单位需与宽度函数一致(像素?字符单元?必须文档写清)
Windows 控制台输出要额外处理 CR/LF
控制台默认按 \r\n 换行,但你的算法只插入 \n。若直接输出到 cmd/powershell,可能显示异常(尤其多行文本叠加)。解决方案:输出前把每个 \n 替换为 \r\n,或用 SetConsoleOutputCP(CP_UTF8) + std::cout.imbue(std::locale("")) 确保 UTF-8 正确解析。Linux/macOS 一般不用管,但 CI 环境若用 Windows runner 就容易漏这点。
真正难的不是切词或算宽,而是统一宽度模型——字体、DPI、渲染后端、终端编码,任何一个变了,折行结果就可能错位。别指望一次写完就能跨平台完美对齐。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










