2014-11-04 12 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; 

`2 차원 배열 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

+0

@ coolest111을 업데이트하고 싶다면 원하는대로 바꾸지 않으시겠습니까? – gsamaras

+0

고마워요 ... 고마워요. 내 실수를 찾았습니다. 변수 H, K를 입력하기 전에 초기화되었습니다. – coolest111

1

명세서 int map[H][W];는 모든 숫자를 저장할 수있는 충분한 공간을 확보 할 계획이다. 그러나 그것은 얼마나 많은 공간이 아직 (W와 H가 당신이 map을 선언하는 시점에서 정의되지 않았는지) 알지 못합니다. 따라서 H와 W가 차지하는 메모리 슬롯에 포함 된 내용에 따라 무작위 (가능하면 제로, 아마도 엄청나게 큰) 공간을 지울 것입니다. 동적으로 메모리를 할당하려면 H와 W를 알고 난 후 (a) 을 수행해야하고 (b) new 키워드를 사용하십시오 ("C에서 동적 메모리 할당"과 같은 검색어를 사용하여 검색하고 while 거기에 계신가요? delete [] map을 끝내면 왜 중요한지 알아보십시오.)

+0

동적 할당을 방지 할 수있는 유일한 방법은 ** 연역적은 H와 W의 사용자 입력이 초과하지 않는지 확인 후 적어도 필요한 것만큼 큰 한 것으로 알려진 배열을 선언하는 것 . (실제로, 당신은 H와 W를 어느 정도 정당성 검사해야합니다.) – jez

+0

Jez 맞았습니다, 미안 해요! 나의 +1을 사과로 받아들이십시오 (그리고 당신이 옳았 기 때문에). :) – gsamaras

+0

음, 기괴한 반전 전쟁을 시작하지 않는 것이 좋지만, 나는 너 *가 옳다고 생각했다. 정적이 아닌 H와 W에서 배열을 정적으로 초기화 할 수 없다고 생각했기 때문에 처음에는 틀렸다고 생각 했었습니다.하지만 흥미로 웠지만 g ++ (Apple LLVM v. 6.0)에서 예제를 컴파일 해 보았습니다. 일하다. 그래서 네가 옳았 어. (하지만 : * C++ 표준에 따라 * C++ 98 또는 C++ 11의 함수가 될 수 있습니다.) C에서 작동하지 않습니다. :) – jez