//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
为什么我的输出中没有得到所有数字?为什么只是最后一行?
答案 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
完成时也很重要。