不使用LINQ实现字符串转指定列宽字符交错数组的方法咨询
原有代码的问题
- 行数计算逻辑有缺陷:直接用
stringContent.Length / arraySize得到整行数量,多申请1行的逻辑没有判断是否存在剩余字符,若字符串长度刚好是arraySize的整数倍会多出空行 - 单行数组长度申请错误:
new char[arraySize - 1]仅申请了4个字符的空间,无法存下最多5个字符,会触发索引越界 - 数组索引使用错误:内层循环
j从1开始赋值,数组下标从0开始,不仅第一个位置未赋值,还会超出数组长度范围 - 剩余字符未处理:原循环仅处理了整行的字符,最后不足
arraySize的剩余字符没有单独存入最后一行 - 输出逻辑缺陷:输出时统一按
arraySize长度遍历所有行,最后一行长度不足时会触发索引越界
正确实现代码
static void Main(string[] args) { int arraySize = 5; string stringContent = "Loremipsumdolorsitamet"; // 计算总行数:有余数则行数+1 int totalLines = stringContent.Length / arraySize; if (stringContent.Length % arraySize != 0) { totalLines++; } char[][] save = new char[totalLines][]; int charIndex = 0; for (int i = 0; i < totalLines; i++) { // 计算当前行实际长度,最后不足5个字符时取剩余数量 int currentLineLength = Math.Min(arraySize, stringContent.Length - charIndex); char[] line = new char[currentLineLength]; for (int j = 0; j < currentLineLength; j++) { line[j] = stringContent[charIndex]; charIndex++; } save[i] = line; } // 输出验证 for (int i = 0; i < save.Length; i++) { for (int k = 0; k < save[i].Length; k++) { Console.Write(save[i][k]); } Console.WriteLine(); } // 如需打印数组结构可使用以下代码 Console.WriteLine("{"); for (int i = 0; i < save.Length; i++) { Console.Write(" { "); for (int k = 0; k < save[i].Length; k++) { Console.Write($"'{save[i][k]}'"); if (k != save[i].Length - 1) { Console.Write(", "); } } Console.Write(" }"); if (i != save.Length - 1) { Console.Write(","); } Console.WriteLine(); } Console.WriteLine("}"); }
实现逻辑说明
- 先根据字符串总长度和单行最大长度计算总行数,存在剩余字符时才多申请一行
- 逐行生成字符数组时,优先判断当前剩余字符数,不足单行最大长度时按实际剩余长度申请数组
- 数组索引统一从0开始遍历赋值,避免越界
- 输出时按每行的实际长度遍历,不会触发越界问题
内容的提问来源于stack exchange,提问作者Linascts
相关产品推荐
相关产品推荐

