提问者:小点点

使用console.readline().split()填充循环中的字符串数组


我有以下非常基本的代码:

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  

它取第一个数字来确定它们的数据行数(这是有原因的,但超出了这个问题的范围。br>循环应该取第2,3和4行并填充数字数组,将数据拆分为numbers0]=11,numbers1]=9,numbers2]=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#。


共2个答案

匿名用户

让我们一步一步走:

  1. 输入3,因此,for循环中的代码将运行3*3=9次。/li> so
  2. 因为现在,它将打印,即

此时输出如下:

3
11 9 1

11

此时输出如下:

3
11 9 1

11
14 90 232

90

此时输出如下:

3
11 9 1

11
14 90 232

90
111 15 111

111

如果您输入包含三个数字的之类的内容,您将遇到一个错误,因为这将是我们第四次执行循环,并且,由于包含三个元素,您将看到以下内容:

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));
    }
}

匿名用户

正如我所看到的,你的数字数组在循环中,所以每次循环进行迭代,数组都会被重新初始化,所以是的,你的程序确实把所有的数字放到数组中,但是只打印第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] + " ");
        }
    }
}

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