【问题标题】:How to take multiple arrays as input in C++?如何在 C++ 中将多个数组作为输入?
【发布时间】:2017-07-26 14:55:12
【问题描述】:

我一周前开始学习 C++,来自 C。

我的输入格式如下:

7
13 -4 -10 4 9 7 -3
4
0 -2 -1 2
2
3 5
0

第一个数字给出第一个数组中元素的数量。一旦这个数字为零,我们就会停止扫描数组。

我想将这些数组扫描成数组数组如下:

[[13,-4,-10,4,9,7,-3] , [0,-2,-1,2] , [3,5]]

我知道如何在第一个数组中扫描:

int n;
int array1[MAXLENGTH];
cin >> n;
for (int i = 0; i < n; i++) {
    cin >> array1[i];
    // scanf("%d", &array1[i]);
}

我卡在0 -2 -1 2,因为它从零开始。

如何在这些数组中扫描并在遇到最后一个零时停止?

【问题讨论】:

  • 为什么在 0 时停止扫描?如果在 0 处停止扫描,为什么要询问元素的数量?无论如何,输入0 -2 -1 2 的期望行为是什么?
  • 使用std::vector 代替数组。 std::vector 可以动态增长,使用 push_back()
  • 您的代码需要两个不同的阶段。读取数组长度,如果为 0 则停止。然后读取数组(没有特殊的 0 处理)。重复
  • 你是将所有数据读入一个数组还是二维数组?
  • @user6005857:不,您不想将数据扫描到数组数组中。您想将数据扫描到vectorvector。主要原因是每个数组的容量在编译时是未知的。要通过为数组动态分配内存来减少注入的缺陷,请使用std::vector

标签: c++ arrays io


【解决方案1】:

无论数据如何,输入模式都是一样的:

unsigned int array_index = 0U;
unsigned int quantity;
std::vector<std::vector<int> > database;
while (cin >> quantity)
{
  if (quantity == 0U)
  {
     break;
  }
  int value = 0;
  for (unsigned int i = 0; i < quantity; ++i)
  {
    cin >> value;
    database[array_index].push_back(value);
  }
  ++array_index;
}

向量的向量应该能够包含数据。

输入数据线:

4
0 -2 -1 2

4 代表第二组数字的数量。 0 是第二组数据的第一个数据。

您的输入文件中有 3 组数据。

【讨论】:

  • 第二个cin 应该检查错误。不要相信用户或数据文件。
  • 您可以通过 hack 解决这个问题:在数据库中添加一个空数组:database.push_back(std::vector&lt;int&gt;()) 在内循环之前。该代码当前使用了超出范围的下标;这将确保下标有效。
  • @anatolyg:很好的收获!我忘记了外部数组和 push_back。
【解决方案2】:

如其他答案所述,您应该有两个嵌套循环。

这是外循环:

std::vector<std::vector<int>> data;

while (true)
{
    int size = 0;

    std::cin >> size;
    if (size == 0)
        break;

    std::vector<int> array;
    ... // fill the array
    data.push_back(array);
}

C++ 向量具有动态大小。也就是说,当您定义动态数组时,您不需要知道大小是多少——它会在添加元素时调整其大小(使用push_back)。这对外循环很方便。


但是,对于内部循环,使用预先分配的向量更方便,因为您的代码很早就“知道”数组的大小:

std::vector<int> array(size); // allocate the array and set all elements to zero
for (int i = 0; i < size; ++i)
{
    std::cin >> array[i];
}

您还可以使用基于范围的循环:

std::vector<int> array(size); // allocate the array and set all elements to zero
for (int& value: array)
{
    std::cin >> value;
}

【讨论】:

    【解决方案3】:
    int n;
    int array1[MAXLENGTH];
    while(true)
    {
    cin >> n;
    if(n == 0) break;
    for (int i = 0; i < n; i++) {
        cin >> array1[i];
        // scanf("%d", &array1[i]);
    }
    }
    

    当然,您应该使用 std::vector,并且您正在丢失您的输入,因为它都存储在同一个数组中,每次都会被覆盖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 2020-10-19
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多