C#控制台程序中最基础也最常见的交互需求之一,就是让用户从键盘输入一组数据并保存到数组中。虽然看起来简单,但实际写法有好几种,每种适用的场景也不一样。有的人习惯让用户逐个输入元素,有的人喜欢让用户把所有数字写在一行里用空格隔开,还有人需要处理用户输错的情况。下面就来详细介绍几种主流的实现方式,并分析它们各自的优缺点。

方法一:循环配合ReadLine逐个输入元素
这是最直观的方式:先询问用户数组的长度,然后创建对应大小的数组,再用一个for循环逐个读取元素。每次调用Console.ReadLine()读取一行输入后,还需要用int.Parse或者Convert.ToInt32把字符串转换成整数。
Console.Write("请输入数组长度:");
int n = int.Parse(Console.ReadLine());
int[] arr = new int[n];
for (int i = 0; i < n; i++)
{
Console.Write($"请输入第{i + 1}个元素:");
arr[i] = int.Parse(Console.ReadLine());
}
Console.WriteLine("数组内容为:" + string.Join(" ", arr));这种写法的优点是逻辑清晰,交互友好,用户每输入一个数都能得到明确的提示,特别适合新手练习。缺点是当数组元素较多时,用户要按很多次回车,操作繁琐,而且只要有一个输入不是合法数字,int.Parse就会直接抛出异常导致程序崩溃。
如果想增强健壮性,可以把int.Parse换成int.TryParse,解析失败时提示用户重新输入,而不是让程序异常退出。这种容错处理在实际项目中非常重要,后面会单独展开讲。
方法二:一行输入多个元素配合Split分割
更符合实际使用习惯的做法,是让用户把所有元素写在一行里,用空格或者逗号隔开,程序一次性读取并拆分。这需要用到字符串的Split方法,再用LINQ的Select把每个子字符串转换成整数。
Console.WriteLine("请输入一组整数,用空格分隔:");
string input = Console.ReadLine();
int[] arr = input
.Split(' ', StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray();
Console.WriteLine("共输入{0}个元素,最大值为{1}", arr.Length, arr.Max());这里有一个细节值得注意:Split(' ', StringSplitOptions.RemoveEmptyEntries)可以自动过滤掉多余的空格。如果不加这个参数,用户不小心输入了两个连续空格,就会拆分出空字符串,导致int.Parse解析失败。
如果希望同时支持空格和逗号混合分隔,可以把分隔符改成数组传入:
int[] arr = input
.Split(new char[] { ' ', ',', ';', '\t' }, StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.ToArray();这种方式的优点是输入效率高,一行搞定,也是算法题、笔试上机中最常见的输入格式。缺点是用户必须在同一行输入完所有数据,中途不好修改,而且对输入格式的规范性有一定要求。
方法三:用TryParse做好异常输入校验
前面两种方法都依赖int.Parse,一旦用户输入了字母或者空内容,程序就会抛出FormatException。真正健壮的程序应该用int.TryParse来处理非法输入,给出友好提示并让用户重新输入。
static int[] ReadIntArray(string prompt)
{
while (true)
{
Console.Write(prompt);
string input = Console.ReadLine();
string[] parts = input.Split(new char[] { ' ', ',' },
StringSplitOptions.RemoveEmptyEntries);
int[] result = new int[parts.Length];
bool valid = true;
for (int i = 0; i < parts.Length; i++)
{
if (!int.TryParse(parts[i], out result[i]))
{
valid = false;
break;
}
}
if (valid && result.Length > 0)
{
return result;
}
Console.WriteLine("输入包含非法内容,请重新输入!");
}
}调用时只需要int[] arr = ReadIntArray("请输入数组:");,就可以反复提示直到用户输入合法为止。把输入逻辑封装成独立方法还有一个好处:主流程代码不会被输入校验的细节污染,可读性和可复用性都更好。
输入字符串数组与二维数组的处理
如果需要输入的是字符串数组而不是整数数组,那就更简单了,不需要任何类型转换,直接拆分即可:
string[] words = Console.ReadLine()
.Split(' ', StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine($"共{words.Length}个单词");如果输入的是double类型的小数数组,只需把int.Parse换成double.Parse即可。但要注意文化区域的问题:某些系统下小数点可能是逗号,必要时可以指定CultureInfo.InvariantCulture来统一格式。
至于二维数组,常见的输入格式是第一行给出行列数,后面每行输入一行元素,此时需要嵌套循环:
string[] size = Console.ReadLine().Split(' ');
int rows = int.Parse(size[0]);
int cols = int.Parse(size[1]);
int[,] matrix = new int[rows, cols];
for (int i = 0; i < rows; i++)
{
string[] line = Console.ReadLine().Split(' ');
for (int j = 0; j < cols; j++)
{
matrix[i, j] = int.Parse(line[j]);
}
}这种格式在在线评测系统和算法竞赛中非常常见,掌握它对刷题帮助很大。
总结与选择建议
三种核心方案的适用场景可以这样概括:需要友好交互、逐个确认的用循环加ReadLine;追求输入效率、格式规整的用Split加LINQ;对健壮性要求高、面向普通用户的务必用TryParse做校验。实际开发中完全可以把它们组合起来,比如用Split读整行,再用TryParse逐个验证,既高效又不会因为一次手误就让程序崩掉。
另外提一点,Console.ReadLine返回的值可能为null(比如输入流被重定向结束时),严格来说应该做null判断。养成这些细心的编码习惯,你的控制台程序会稳定得多。
c#控制台输入数组C#数组输入Console.ReadLine修改时间:2026-09-13 13:24:30