使用 Console.ReadLine().Split() 循环填充字符串数组
Using Console.ReadLine().Split() to fill a string array in a loop
我有以下非常基本的代码:
static void Main(string[] args)
{
int n = Convert.ToInt32(Console.ReadLine());
for (int i = 0; i < n*3; i++)
{
string[] numbers = Console.ReadLine().Split();
Console.WriteLine();
Console.WriteLine(numbers[i]);
}
}
它应该采用以下数据:
3
11 9 1
14 90 232
111 15 111
它用第一个数字来确定它们的数据行数(这是有原因的,但超出了这个问题的范围。
循环应采用第 2、3 和 4 行并填充数字数组,将数据拆分为数字[0] = 11、数字[1] = 9、数字[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#。
正如我所见,你的数字数组在循环内,所以每次循环进行迭代时,数组都会重新初始化,所以是的 - 你的程序确实将所有数字放在数组中但只打印 ith 元素,即使它运行 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] + " ");
}
}
}
尽管我不完全理解您的预期输出。是否要再次显示最后打印的行?如果是,您可以在将新数字读入之前简单地打印数字数组(确保它不为空,使用布尔标志或其他东西)。
一步步来:
- 你输入 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 < n*3; i++)
{
string[] numbers = Console.ReadLine().Split();
Console.WriteLine();
Console.WriteLine(string.Join(" ", numbers));
}
}
我有以下非常基本的代码:
static void Main(string[] args) { int n = Convert.ToInt32(Console.ReadLine()); for (int i = 0; i < n*3; i++) { string[] numbers = Console.ReadLine().Split(); Console.WriteLine(); Console.WriteLine(numbers[i]); } }
它应该采用以下数据:
3
11 9 1
14 90 232
111 15 111
它用第一个数字来确定它们的数据行数(这是有原因的,但超出了这个问题的范围。
循环应采用第 2、3 和 4 行并填充数字数组,将数据拆分为数字[0] = 11、数字[1] = 9、数字[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#。
正如我所见,你的数字数组在循环内,所以每次循环进行迭代时,数组都会重新初始化,所以是的 - 你的程序确实将所有数字放在数组中但只打印 ith 元素,即使它运行 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] + " ");
}
}
}
尽管我不完全理解您的预期输出。是否要再次显示最后打印的行?如果是,您可以在将新数字读入之前简单地打印数字数组(确保它不为空,使用布尔标志或其他东西)。
一步步来:
- 你输入 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 < n*3; i++) { string[] numbers = Console.ReadLine().Split(); Console.WriteLine(); Console.WriteLine(string.Join(" ", numbers)); } }