2013-04-29 12 views
0

9 개의 정수 값으로 문자열 9 개를 읽고 배열에 저장하려고합니다. (지금은 9 개의 정수로 저장합니다. 일단 그들이 OK에서 읽으면 배열에서). 일반적인 접근 방식은 내가 가져 갔다 : 문자열을 9 개의 문자 값으로 나누고, 각각을 정수로 변환하고 9 개의 정수로 저장하고, 정수를 배열에 넣는다. 이상한 점은 하나의 값이 아무런 문제없이 하나의 문자로 나뉘는 반면, 꼭대기에있는 다른 값 (어떻게 그 문자에 전혀 포함되어 있지 않습니까?)을 어떻게 든 "보게"하고 뒤쪽으로 변환한다는 것입니다.C++ atoi 프로그램의 같은 부분에 생성 된 다른 문자의 값을

샘플 코드 :

countrows = 1; 
countcols = 1; 
cout << endl << "Enter values for boxes in row " << countrows << ", enter 0 for open boxes (enter 9 numbers, with no spaces or delimiters): "; 
string inputline; 
cin >> inputline; 
char col1, col2, col3, col4, col5, col6, col7, col8, col9; 
int int1, int2, int3, int4, int5, int6, int7, int8, int9; 
col1 = inputline[0]; 
col2 = inputline[1]; 
col3 = inputline[2]; 
col4 = inputline[3]; 
col5 = inputline[4]; 
col6 = inputline[5]; 
col7 = inputline[6]; 
col8 = inputline[7]; 
col9 = inputline[8]; 
int1 = atoi(&col1); 
int2 = atoi(&col2); 
int3 = atoi(&col3); 
int4 = atoi(&col4); 
int5 = atoi(&col5); 
int6 = atoi(&col6); 
int7 = atoi(&col7); 
int8 = atoi(&col8); 
int9 = atoi(&col9); 
cout << "inputline: " << inputline << endl; 
cout << "col1: " << col1 << " col2: " << col2 << " col3: " << col3 << endl; //debug line 
cout << "int1: " << int1 << " int2: " << int2 << " int3: " << int3 << endl; //debug line 

이것의 결과는 다음

은 (공백 또는 구분자 9 개 숫자 입력) 오픈 박스 0을 입력 행 1 박스 값을 입력 456,123,789 inputline : 456,123,789 COL1 4 COL2 5 COL3 6 INT1 4 INT2 54 INT3 : 654

이유 INT는 (INT1 같아야 4 INT2 5 INT3 : 6) (5) 및 (65) INT3 포함 않는다

답변

3

atoi은 NULL이 아닌 종료 문자열 (char *)을 변환하는 데 사용되며 문자는 정수로 변환하지 않습니다. col1, col2은 NULL로 끝나는 문자열이 아니며, atoi은 NULL 값이 될 때까지 메모리를 읽습니다 (문자열을 끝냄).

int1 = col1 - '0'; 

COL1 : 4 COL2 : 5 COL3 : 6 INT1 : 4 INT2 : 54 INT3 : 654

당신이 번호로 ASCII 숫자를 변경하려면

, 당신은 간단한 수학을 사용할 수 있습니다

이 값들은 모두 스택에 저장됩니다.

STACK 
---------- 
0   <- top 

지금, 당신의 col1, col2col3가 배치됩니다 :의 (이것은 다른 지역 주민, 반환 주소, 그런 일이있다, 아니다), 그 상위 요소가 0입니다 스택은 현재 비어있는 가정하자 당신이 그 (것)들에게 값을 assing하면, 당신은 사진 아래 얻을 것이다,

STACK 
---------- 
0 
col1 
col2 
col3 

을 그리고 : 스택에, 당신은 그들을 선언으로

STACK 
---------- 
0 
'4' 
'5' 
'6' 

때 당신을 C 모두 atoi(col1)이면 '4'을 읽고 문자열을 종료하는 0을 입력하면 ASCII '4' 만 구문 분석됩니다. atoi(col2)을 호출하면 '5', '4', 그리고 0으로 표시되므로 입력 문자열은 "54"이되므로 정확하게 구문 분석합니다. 다른 모든 col 변수에 대해서도 마찬가지입니다.

역순으로 스택 요소를 읽는 것에 관해서는 마술 같은 것이 없다는 사실에 주목하십시오. 실제로 내 순서대로 메모리를 읽는 것은 기계 스택이 아래쪽으로 커지고 있기 때문입니다.일부 컴퓨터에서는이 경우가 아니며 (자세한 내용은 this link을 확인하십시오.) col1에 대해 456...을 얻거나 아니면 단지 0 만 가져옵니다 (atoi은 숫자가 아닌 문자열을 인수로 전달하면 0을 반환합니다).

+0

은 C 문자열의 문자 배열이 아니며 문자는 크기가 1 인 문자 배열입니까? – user2333388

+1

아니요, C- 문자열은 0 (NULL) 요소로 끝나는 문자 배열입니다. 어떻게 든 C는 문자열이 얼마나 긴지를 알아야합니다. 그렇죠? –

+0

그리고 문자는 문자 배열이 아닙니다. 그것은 단지 원시적 인 유형입니다. –