二维数组C ++(输入和打印)

时间:2014-11-04 01:10:46

标签: c++ arrays multidimensional-array

//Variable Description
int H,W;
int map[H][W];


//Input
cin>>W>>H;

for(int i=0; i<H; i++)
{
    for (int j=0; j<W; j++)
    {
       cin>>map[i][j];
    }

}

cout<<endl;
//Print
for(int i=0; i<H; i++)
{
    for (int j=0; j<W; j++)
    {
        cout<<map[i][j];
    }

}
cout<<endl;
return 0;

`

我的输出是:

3 3
1 2 3
4 5 6
7 8 9

789789789

为什么我的输出中没有得到所有数字?为什么只是最后一行?

2 个答案:

答案 0 :(得分:3)

声明它后,你正在初始化数组的大小!!!

您不能在C ++中使用可变长度数组。请阅读this回答。

所以,您应该使用std::vector,如下所示:

#include <iostream>
#include <vector>

using namespace std;

int main() {
  int H, W;
  cin >> W >> H;
  std::vector< std::vector<int> > map;
  map.resize(H); // H rows
  for(int i = 0; i < H; ++i)
    map[i].resize(W); // in every row, create W columns
  // thus this is equivalent to a HxD array

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> map[i][j];
    }

  }

  cout << endl;
  //Print
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cout << map[i][j] << " ";
    }

  }
  cout << endl;
  return 0;
}

您可以使用数组执行此操作,但您应该使用动态内存分配,这需要您在完成后取消分配内存。以下是它应该如何:

#include <iostream>
#include <vector>

using namespace std;

int main() {
  int H, W;
  cin >> H >> W;

  int** map = new int*[H];
  for(int i = 0; i < H; ++i)
    map[i] = new int[W];

  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cin >> map[i][j];
    }

  }

  cout << endl;
  //Print
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) {
      cout << map[i][j] << " ";
    }

  }
  cout << endl;


  // DON'T FORGET TO FREE
  for(int i = 0; i < H; ++i) {
    delete [] map[i];
  }
  delete [] map;
  return 0;
}

答案 1 :(得分:1)

你的陈述int map[H][W];打算留出足够的空间来容纳所有数字。但它还不知道还有多少空间(W和H在您声明map时未定义)。因此它将清除一些随机(可能为零,可能是非常大)的空间量,这取决于H和W占用的内存插槽恰好包含的内容。要动态分配内存,您需要这样做(a) H和W之后,以及(b)使用new关键字(使用类似&的搜索字词查找) #34; C ++中的动态内存分配&#34;,当你在那里时,找出为什么它对你delete [] map完成时也很重要。