字符串自动折行有四种方法:一、空格分隔智能折行,优先在空格断行以保单词完整;二、固定长度强制折行,严格按字符数截断,适用于中文等无空格文本;三、Unicode感知折行,先解码UTF-8为码点再按字符数折行防乱码;四、自定义streambuf实现透明折行,绑定ostream后自动处理。

如果需要将一段字符串按照指定的字符长度进行自动折行输出,以满足文本排版需求,则需在不破坏单词完整性(或按字节/字符边界)的前提下插入换行符。以下是实现此功能的多种方法:
一、基于空格分隔的智能折行
该方法优先在空格处断行,确保单词不被截断,适用于以空格分隔的英文或半角文本。当某一行剩余空间不足以容纳下一个完整单词时,在前一个空格后插入换行。
1、定义目标行宽 max_width 和当前行缓冲区 current_line。
2、使用 std::istringstream 按空格分割原始字符串为单词序列。
3、遍历每个单词:若 current_line 为空,则直接加入单词;否则检查加入该单词后长度是否超过 max_width,若超则输出当前行并重置 current_line 为该单词。
4、处理完所有单词后,输出剩余的 current_line。
二、固定长度强制折行(无空格判断)
该方法严格按字符数截断,每 max_width 个字符插入换行符,适用于中文、日文等无空格分隔的文本,或对排版精度要求严格的场景。
1、获取原始字符串 text 的长度 len。
2、初始化起始索引 start = 0。
3、循环执行:计算当前段结束位置 end = std::min(start + max_width, len),提取子串 text.substr(start, end - start) 并输出。
4、将 start 更新为 end,直至 start >= len。
三、支持 Unicode 字符宽度的折行(UTF-8 环境)
在 UTF-8 编码下,单个汉字或符号可能占多个字节,直接按字节截断会导致乱码。该方法先将 UTF-8 字符串解码为 Unicode 码点序列,再按字符数量而非字节数折行。
1、使用 std::wstring_convert<:codecvt_utf8>, char32_t> 将输入字符串转为 std::u32string。
2、遍历 u32string 中每个 char32_t 元素,累计字符计数。
3、每当累计字符数达到 max_width,在当前位置插入换行,并重置计数器。
4、将处理后的 u32string 重新编码为 UTF-8 字符串输出。
四、使用 std::ostream 自定义流缓冲区实现透明折行
通过继承 std::streambuf 并重写 sputn 和 overflow,可在写入任意 std::ostream(如 std::cout)时自动触发折行逻辑,无需修改原有输出语句。
1、定义派生类 WrappedStreamBuf,保存 max_width 和当前列位置 column。
2、在 sputn 中逐字符处理输入缓冲区:对每个字符,判断是否为空格或换行符;若非换行且列位置加字符宽度将超限,则先写入 '\n' 并重置 column。
3、将该缓冲区绑定至 std::ostream wrapper 实例,后续所有对该实例的
4、调用 wrapper.flush() 确保末尾未满行内容被输出。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











