2012-08-09 2 views
0

다음 프로그램에서 6 길이 문자열 dd를 읽고 ASCII 코드를 크기가 3x2 인 정수 배열 ipc에 저장하고 있습니다. 문제는 ipc에 저장된 값이 잘못되어 나중에 다시 인쇄 할 때 변경된다는 것입니다. 이런 간단한 코드로 어떻게 명확한 문제가 생길 수 있는지 놀랍습니다.배열 값 자체가 C++에서 변경됩니다

#include<iostream> 

using namespace std; 

int main() 
{ char dd[5]; 
    int ipc[2][1]; 
    cin.get(dd,6); 
    for(int i=0;i<3;i++) 
    { for(int j=0;j<2;j++) 
    { ipc[i][j]=int(dd[j+2*i]); 
     cout<<ipc[i][j]<<endl; 
    } 
    } 
    cout<<"------"<<endl; 
    for(int i=0;i<3;i++) 
    { for(int j=0;j<2;j++) 
    { cout<<ipc[i][j]<<endl; } 
    } 
} 

주어진 입력이 123456 인 경우 (내가 Win7에 x64의에 코드 :: 블록 10.05을 사용하고 있습니다), 출력은 다음과 같습니다

49 
50 
51 
52 
53 
2 
------ 
49 
51 
51 
53 
53 
2 

도움의 어떤 종류는 매우 이해할 수있을 것이다. 고맙습니다.

답변

12

배열 선언이 잘못되었으며 코드가 배열에서 범위를 벗어나 정의되지 않은 동작을합니다.

int ipc[2][1]; 

에 : 선언에서 변경해야

int ipc[3][2]; 

또한, cin.get() 그래서, count - 1 문자를 읽습니다 :

cin.get(dd, 6); 

5 문자가 아닌 6을 읽습니다. 사용자가 123456을 입력하면 12345 만 읽습니다. cin.get()도 null 문자를 추가합니다 (주석으로 tinman으로 표시).

char buf[7]; 
cin.get(buf, 7); 
+0

하지 배열은 0부터 시작, 그래서 왜 IPC를 정의 할 필요합니까 [3] [2] : dd의 크기와 문자의 수를 증가 해결하려면 읽을 수? – xan99

+2

'char dd [5];와'cin.get (dd, 6); '에 문제가 없는가? '\ 0'은 자동으로 dd [5]에 저장됩니다. – tinman

+0

@ xan99 배열의 인덱스는 0부터 계산되기 시작하지만 크기 (여기에서 지정하는)는 인덱스가 아닙니다. – Nobody