
本文介绍一种安全、可靠的字符串自动换行算法:在不超过最大宽度的前提下,将文本按单词边界(空格)截断,避免单词被强行拆分,适用于控制台输出、日志格式化或简单文本渲染场景。
本文介绍一种安全、可靠的字符串自动换行算法:在不超过最大宽度的前提下,将文本按单词边界(空格)截断,避免单词被强行拆分,适用于控制台输出、日志格式化或简单文本渲染场景。
在命令行或轻量级文本处理中,常需将长字符串“智能换行”——即每行最多显示 N 个字符,但绝不切断单词,而是回退到前一个空格处断行。原始代码存在多个关键问题:硬编码索引(如 substring(pos+1,21))、未处理越界异常、循环逻辑错误(从 20 向下遍历却对所有空格重复输出),导致输出混乱且不可控。
正确的思路是迭代式切片:维护当前起始位置 startPos,每次尝试在 startPos + maxWidth 附近寻找最靠右的空格;若找到,则以此为断点;若未找到(如本行无空格或剩余部分 ≤ maxWidth),则强制在 startPos + maxWidth 处截断(作为兜底策略,确保不无限循环)。
以下是健壮、可复用的 Java 实现:
import java.util.Scanner;
public class SmartLineBreaker {
public static void wrapText(String input, int maxWidth) {
if (input == null || input.isEmpty() || maxWidth = startPos; i--) {
if (input.charAt(i) == ' ') {
breakIndex = i;
break;
}
}
// 若找到空格,以该位置为断点;否则强制在 endPos 截断(处理超长单词)
if (breakIndex != -1) {
System.out.println(input.substring(startPos, breakIndex).stripTrailing());
startPos = breakIndex + 1;
} else {
// 无空格 → 强制截断(如连续字母、URL 等)
System.out.println(input.substring(startPos, endPos).stripTrailing());
startPos = endPos;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Please input a word: ");
String input = scanner.nextLine();
wrapText(input, 20);
}
}
✅ 关键设计说明:
- 使用 stripTrailing() 清除行尾冗余空格,提升输出整洁度;
- Math.min(startPos + maxWidth, input.length()) 防止 endPos 越界;
- 内层循环从右向左搜索,确保取到最靠近 maxWidth 的前一个空格,而非第一个空格;
- 对无空格场景(如长单词、数字串)提供优雅降级,避免程序崩溃或死循环。
⚠️ 注意事项:
- 该算法不修改原字符串,仅作只读遍历,线程安全;
- 若需支持 Unicode 空格(如 、 )或中文标点断行,可扩展空格判断逻辑(例如使用 Character.isWhitespace());
- 实际生产环境推荐使用成熟库(如 Apache Commons Text 的 WordUtils.wrap()),本实现聚焦原理教学与轻量定制需求。
通过这种“定位—切片—推进”的三步法,你既能精准控制每行宽度,又能保障语义完整性——让每一行都以完整单词收尾,真正实现专业级文本排版效果。










