使用 Console.ReadLine().Split() 在循环中填充字符串数组
Posted
技术标签:
【中文标题】使用 Console.ReadLine().Split() 在循环中填充字符串数组【英文标题】:Using Console.ReadLine().Split() to fill a string array in a loop 【发布时间】:2020-10-13 08:01:59 【问题描述】:我有以下非常基本的代码:
static void Main(string[] args) int n = Convert.ToInt32(Console.ReadLine()); for (int i = 0; i它应该采用以下数据:
3 11 9 1 14 90 232 111 15 111
用第一个数字来确定它们的数据行数(这是有原因的,但超出了这个问题的范围。 该循环应采用第 2、3 和 4 行并填充 numbers 数组,将数据拆分为 numbers[0] = 11、numbers[1] = 9、numbers[2] = 1...等等。 我所看到的是它将行中的第一个数字放入数组中并继续前进。以下是它目前正在做的事情的预览:
3 11 9 1 11 14 90 232 90 111 15 111
我希望输出是:
3 11 9 1 11 9 1 14 90 232 14 90 232 111 15 111 111 15 111
我可能在做一些完全愚蠢和明显的事情,但我仍在努力学习 C#。
【问题讨论】:
“我所看到的是它将第一个数字放入数组中并继续前进。”不,它会将所有内容都放入数组中 - 但是在继续之前您只需 打印 一个数字。你会如何期望Console.WriteLine(numbers[i]);
打印多个数字?
因为我假设它运行循环 9 次.. 数组中的每个数字一个?是否将数字批量添加到数组中?
但它运行 整个 循环 9 次 - 所以它从控制台读取 9 行,并从每一个中打印 一个 数字线。听起来那不是你想要的。我建议你在调试器中单步调试代码,仔细查看每一步的值。
尝试运行程序并输入Banana
而不是数字。看看那里发生了什么。
【参考方案1】:
让我们一步一步来:
-
您输入 3,所以
n = 3
并且 for 循环中的代码将运行 3 * 3 = 9 次。
你输入11 9 1
所以string[] numbers = "11", "9", "1" ;
。
然后它会打印一个空行。
由于现在i = 0
,它将打印numbers[0]
,即"11"
(它将打印11
)。
此时的输出如下:
3
11 9 1
11
-
你输入
14 90 232
,所以string numbers = "14", "90", "232" ;
。
空白行
现在这是我们第二次通过循环和i = 1
。所以它将打印numbers[1]
,即"90"
。
此时的输出如下:
3
11 9 1
11
14 90 232
90
-
你输入
111 15 111
,所以string numbers = "111", "15", "111" ;
。
空白行
现在这是我们第三次通过循环和i = 2
。所以它将打印numbers[2]
,即"111"
。
此时的输出如下:
3
11 9 1
11
14 90 232
90
111 15 111
111
如果您输入像 1 2 3
这样包含三个数字的内容,您将遇到错误,因为这将是我们将第四次遍历循环,而 i = 3
并且由于 numbers
包含三个元素,您将看到以下:
System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'
我推荐string.Join() 以获得您预期的结果。
解决方案如下:
static void Main(string[] args) int n = Convert.ToInt32(Console.ReadLine()); for (int i = 0; i
【讨论】:
【参考方案2】:如我所见,您的 numbers 数组在循环内,因此每次循环进行迭代时,数组都会重新初始化,所以是的 - 您的程序确实将所有数字放入数组中,但只打印 第 i 个元素,即使它运行 9 次,它也会将数组初始化 9 次(尽管这是一件大事)。以下是您的代码更简单,更容易。
static void Main(string[] args)
int n = Convert.ToInt32(Console.ReadLine());
string numbers[3];
// read n lines, one by one
for (int i = 0; i < n; i++)
numbers = Console.ReadLine().Split();
Console.WriteLine();
// print the 3 numbers, either using a smaller loop or simply indexing
// I use a loop here to make it more dynamic
for (int j = 0; j < 3; j++)
Console.WriteLine(numbers[j] + " ");
虽然我不完全理解您的预期输出。是否要再次显示最后打印的行?如果是,您可以在将新数字读入之前简单地打印数字数组(确保它不为空,使用布尔标志或其他东西)。
【讨论】:
以上是关于使用 Console.ReadLine().Split() 在循环中填充字符串数组的主要内容,如果未能解决你的问题,请参考以下文章
Console.Read() 和 Console.ReadLine() 之间的区别?
重载 Console.ReadLine 可能吗? (或任何静态类方法)
C# Console.Read();和Console.ReadLine();和Console.ReadKey();区别详解。