【问题标题】:Using Console.ReadLine().Split() to fill a string array in a loop使用 Console.ReadLine().Split() 在循环中填充字符串数组
【发布时间】: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而不是数字。看看那里发生了什么。

标签: c# arrays loops console.readline


【解决方案1】:

让我们一步一步来

  1. 您输入 3,所以 n = 3 并且 for 循环中的代码将运行 3 * 3 = 9 次。
  2. 你输入11 9 1所以string[] numbers = { "11", "9", "1" };
  3. 然后它会打印一个空行。
  4. 由于现在i = 0,它将打印numbers[0],即"11"(它将打印11)。

此时的输出如下:

3
11 9 1

11
  1. 你输入14 90 232,所以string numbers = { "14", "90", "232" };
  2. 空白行
  3. 现在这是我们第二次通过循环和i = 1。所以它将打印numbers[1],即"90"

此时的输出如下:

3
11 9 1

11
14 90 232

90
  1. 你输入111 15 111,所以string numbers = { "111", "15", "111" };
  2. 空白行
  3. 现在这是我们第三次通过循环和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] + " ");
            }
        }
    }
    

    虽然我不完全理解您的预期输出。是否要再次显示最后打印的行?如果是,您可以在将新数字读入之前简单地打印数字数组(确保它不为空,使用布尔标志或其他东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      相关资源
      最近更新 更多