2014-11-04 273 views
-1
//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; 

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

我的输出是:

3 3 
1 2 3 
4 5 6 
7 8 9 

789789789 

为什么我不能在我的输出让所有的数字吗?为什么只是最后一行?

回答

1

在声明它之后,您正在初始化数组的大小!你不能在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; 
} 
+0

我想用户输入数组的大小,然后输入数组,然后打印 – coolest111 2014-11-04 01:17:18

+0

@ coolest111,已更新,是不是你想要的? – gsamaras 2014-11-04 01:17:43

+0

感谢这工作....确定发现我的错误...初始化之前输入变量H,K – coolest111 2014-11-04 01:21:53

1

你的陈述int map[H][W];打算腾出足够的空间来容纳所有的数字。但它不知道还有多少空间(W和H在你声明map时未定义)。所以它会清除一些随机的(可能为零,可能很大的)空间量,这取决于H和W所占据的内存插槽所包含的内容。要动态地分配内存,你需要这样做(a)之后H和W是已知的,并且(b)使用new关键字(用“C++中的动态内存分配”你在那里,当你完成它时,找出为什么它也很重要delete [] map)。

+0

避免动态分配的唯一方法是声明一个已知**的数组,至少和必要的一样大,然后检查用户对H和W的输入是否超过此数。 (其实,你必须要有理智的检查H和W。) – jez 2014-11-04 01:22:43

+0

Jez你说得对,对不起!以我的+1作为道歉(因为你是对的)。 :) – gsamaras 2014-11-04 02:10:28

+0

错误,以及不开始一种奇怪的反火焰战争,但我认为你*是正确的。我*最初*认为你错了,因为我认为你不能从非常量H和W静态地初始化一个数组。但是,然后,好奇,我试着用g ++(Apple LLVM v。6.0)编译你的例子,上班。所以你是对的。 (但是:这可能是你所遵循的C++标准的一个函数--- C++ 98或C++ 11。它肯定不会在普通的C中工作。):) – jez 2014-11-04 02:20:08