C#实现按单词拆分长字符串 每行最多20字符且不截断单词
原代码存在的问题
- 字符串数组
line未初始化就直接赋值,会触发空引用异常 - while循环内每次都将索引变量
i重置为0,所有截取的内容都会覆盖数组第一个元素 - 仅单次查找小于20的空格,没有循环处理整段文本的所有行
- void方法错误添加返回值
return split,存在语法错误 - 没有处理第20个字符前后最后一个空格的判断逻辑,也没有覆盖单单词超过20字符、剩余内容不足20字符等边界场景
修改后可运行的完整代码
using System; using System.Collections.Generic; namespace stringToLines { class Program { static void SplitSentenceToLines() { string input = Console.ReadLine()?.Trim() ?? string.Empty; List<string> lines = new List<string>(); int currentPosition = 0; const int maxLineLength = 20; while (currentPosition < input.Length) { // 剩余字符不足20,直接作为最后一行 if (input.Length - currentPosition <= maxLineLength) { lines.Add(input.Substring(currentPosition)); break; } // 查找第20个字符之前最后一个空格的位置 int splitPosition = input.LastIndexOf(' ', currentPosition + maxLineLength, maxLineLength); // 未找到空格说明当前单词超过20字符,强制在20字符位置拆分 if (splitPosition == -1) { splitPosition = currentPosition + maxLineLength; } // 截取当前行,跳过空格本身 lines.Add(input.Substring(currentPosition, splitPosition - currentPosition).TrimEnd()); currentPosition = splitPosition + 1; } // 输出所有拆分后的行 foreach (var line in lines) { Console.WriteLine(line); } Console.ReadLine(); } static void Main(string[] args) { Console.WriteLine("Please enter your long sentence(>20 characters)"); SplitSentenceToLines(); } } }
核心逻辑说明
- 用
List<string>替代固定长度数组,无需提前计算行数,避免数组越界问题 - 每次从当前位置往后找20个字符范围内的最后一个空格,保证在完整单词末尾拆分
- 新增边界处理:如果连续20个字符都没有空格(单个单词超长),直接在20字符位置强制拆分
- 剩余字符不足20时直接整段截取作为最后一行
内容的提问来源于stack exchange,提问作者Tickis
相关产品推荐
相关产品推荐

