
本文详解如何将字符串按每行约20字符自动换行,且确保断点位于最近的空格处(不切割单词),并提供健壮的java实现、常见错误分析及边界情况处理方案。
本文详解如何将字符串按每行约20字符自动换行,且确保断点位于最近的空格处(不切割单词),并提供健壮的java实现、常见错误分析及边界情况处理方案。
在文本处理中,简单按固定长度(如20字符)截断字符串常导致单词被强行割裂(例如 "programming" 变成 "programm" + "ing"),严重影响可读性。理想的方案是:优先在指定位置(如第20个字符)之后的第一个空格处断行;若该位置后无空格,则退而求其次,在该位置前最后一个空格处断行;若整段无空格,则强制在指定位置截断(避免无限循环)。
你原始代码中的核心问题在于:
- endPos 被硬编码为 20,未动态查找空格;
- startPos = endPos + 1 在首次迭代后会使 startPos=21,而下次调用 substring(21, 20) 直接触发 StringIndexOutOfBoundsException(起始索引大于结束索引);
- 缺少对“当前片段内无空格”“剩余长度不足20”等边界条件的判断。
以下是经过完整验证的专业实现:
import java.util.Scanner;
public class LineWrapper {
private static final int MAX_LINE_LENGTH = 20;
public static void main(String[] args) {
System.out.println("Please input a word: ");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine().trim();
wrapText(input, MAX_LINE_LENGTH);
}
public static void wrapText(String text, int maxLength) {
int startPos = 0;
while (startPos = text.length()) {
System.out.println(text.substring(startPos));
break;
}
// 情况2:从 startPos+maxLength 开始向后找第一个空格(更自然的断点)
int spaceAfter = text.indexOf(' ', endPos);
if (spaceAfter != -1) {
System.out.println(text.substring(startPos, spaceAfter));
startPos = spaceAfter + 1; // 跳过空格,从下一个字符开始
continue;
}
// 情况3:向后没找到空格 → 向前找最后一个空格
int spaceBefore = text.lastIndexOf(' ', endPos);
if (spaceBefore != -1 && spaceBefore > startPos) {
System.out.println(text.substring(startPos, spaceBefore));
startPos = spaceBefore + 1;
continue;
}
// 情况4:当前片段内无空格(如长单词、URL)→ 强制截断
System.out.println(text.substring(startPos, endPos));
startPos = endPos;
}
}
}
✅ 关键逻辑说明:
- startPos 始终指向新行的起始索引,endPos 是目标断点(startPos + 20),不是固定值;
- indexOf(' ', endPos) 从第20位向后搜索,找到首个空格即断行(如 "Hello there, I am " → 在 ' ' 处断,保留完整单词);
- 若向后无空格(如 "Supercalifragilisticexpialidocious"),则用 lastIndexOf(' ', endPos) 向前搜索,确保不断词;
- 所有分支均更新 startPos,且严格保证 startPos ≤ text.length(),彻底规避索引越界。
⚠️ 注意事项:
- 输入为空或仅空格时,.trim() 可提前处理,避免无效输出;
- 中文、日文等无空格语言需改用字符数限制(本方案默认适用于空格分隔的拉丁语系);
- 如需添加缩进或特殊符号(如题干中的星号边框),可在 println 前拼接前缀字符串;
- 生产环境建议封装为 List
返回而非直接打印,便于测试与复用。
通过此方案,输入 "Hello there, I am doing some coding, I need some help" 将精准输出:
Hello there, I am doing some coding, I need some help
——每一行均≤20字符,且严格以空格为界,真正实现语义完整的自动断行。










