使用 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() 在循环中填充字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

相当于 c++ 中的 Console.ReadLine()

如何向 Console.ReadLine() 添加超时?

Console.Read() 和 Console.ReadLine() 之间的区别?

Console.ReadLine(); 获取用户输入内容

重载 Console.ReadLine 可能吗? (或任何静态类方法)

C# Console.Read();和Console.ReadLine();和Console.ReadKey();区别详解。