如何在C#中通过控制台一次性输入完整二维矩阵并解决格式异常?
解决C#控制台一次性输入矩阵所有值的FormatException问题
你的问题核心在于输入处理逻辑和用户的输入方式不匹配:你原代码期望用户先输入行列数,再逐行输入每个元素,但实际用户是一次性把行列数+所有矩阵值都输入到一行里了,这就导致后续的Console.ReadLine()要么读取空内容,要么读取的不是有效数字,直接抛出格式异常。
下面是适配一次性输入场景的完整解决方案:
步骤说明
- 一次性读取所有用户输入(不管是单行还是多行输入都能处理)
- 将输入按空白字符(空格、换行、制表符)分割成独立的数字字符串
- 从分割结果中提取前两个值作为矩阵的行和列数
- 用剩余的数字填充二维矩阵
- 加入基础输入验证,避免未处理的异常
完整代码示例
try { // 读取所有输入(支持单行或多行输入,比ReadLine更灵活) string input = Console.In.ReadToEnd(); // 按所有空白字符分割,同时移除空项(避免多个空格/换行产生无效空字符串) string[] allValues = input.Split(new[] {' ', '\t', '\n', '\r'}, StringSplitOptions.RemoveEmptyEntries); // 验证是否至少输入了行列数 if (allValues.Length < 2) { Console.WriteLine("错误:请至少输入矩阵的行数和列数"); return; } // 解析行和列数 long row = long.Parse(allValues[0]); long col = long.Parse(allValues[1]); // 验证剩余数值是否足够填充矩阵 if (allValues.Length != 2 + row * col) { Console.WriteLine($"错误:需要输入 {row * col} 个矩阵值,但实际输入了 {allValues.Length - 2} 个"); return; } // 创建矩阵并填充数据 long[,] matrix = new long[row, col]; int valueIndex = 2; // 跳过前两个行列数值 for (long i = 0; i < row; i++) { for (long j = 0; j < col; j++) { matrix[i, j] = long.Parse(allValues[valueIndex++]); } } // 验证输出矩阵 Console.WriteLine("输入的矩阵为:"); for (long i = 0; i < row; i++) { for (long j = 0; j < col; j++) { Console.Write($"{matrix[i, j]} "); } Console.WriteLine(); } } catch (FormatException) { Console.WriteLine("错误:输入的不是有效的整数,请检查输入格式"); } catch (Exception ex) { Console.WriteLine($"发生未知错误:{ex.Message}"); }
针对你的输入示例测试
当用户输入3 3 4 2 1 1 1 3 1 1 2时,代码会:
- 分割成数组:
["3", "3", "4", "2", "1", "1", "1", "3", "1", "1", "2"] - 解析得到行=3,列=3
- 用后续9个值填充3x3矩阵,最终输出:
4 2 1 1 1 3 1 1 2
关键改进点
- 用
Console.In.ReadToEnd()替代多次Console.ReadLine(),确保一次性获取所有输入(包括用户换行输入的情况) - 分割时兼容所有空白字符,适配各种输入格式
- 加入输入长度验证,提前告知用户错误,避免抛出未处理异常
- 统一使用
long.Parse,保持矩阵元素类型和矩阵定义一致(你原代码里矩阵是long[,]但用了int.Parse,这里做了统一)
内容的提问来源于stack exchange,提问作者flowname
相关产品推荐
相关产品推荐

