2009-12-16 2 views
1
#include <iostream> 
#include <cctype> // isdigit 
using namespace std; 

// Global buffer 
const int LINE_LENGTH = 128; 
char line[LINE_LENGTH]; 
int lineIndex; 

void getLine() { 
// Get a line of characters. 
// Install a newline character as sentinel. 
    cin.getline (line, LINE_LENGTH); 
    line[cin.gcount() - 1] = '\n'; 
    lineIndex = 0; 
} 

enum State {eI, eF, eM, eSTOP}; 

void parseNum (bool& v, int& n) { 
    int sign; 
    State state; 
    char nextChar; 
    v = true; 
    state = eI; 

    do { 
     nextChar = line[lineIndex++]; 
     switch (state) { 
     case eI: 
      if (nextChar == '+') { 
       sign = +1; 
       state = eF; 
      } 
      else if (nextChar == '-') { 
       sign = -1; 
       state = eF; 
      } 
      else if (isdigit (nextChar)) { 
       sign = +1; 
       n = nextChar - '0'; // line 41 
       state = eM; 
      } 
      else { 
       v = false; 
      } 
      break; 
     case eF: 
      if (isdigit (nextChar)) { 
       n = nextChar - '0'; 
       state = eM; 
      } 
      else { 
       v = false; 
      } 
      break; 
     case eM: 
      if (isdigit (nextChar)) { 
       n = 10 * n + nextChar - '0'; 
      } 
      else if (nextChar == '\n') { 
       n = sign * n; 
       state = eSTOP; 
      } 
      else { 
       v = false; 
      } 
      break; 
     } 
    } 
    while ((state != eSTOP) && v); 
} 

int main() { 
    bool valid; 
    int num; 
    cout << "Enter number: "; 
    getLine(); 
    parseNum (valid, num); 
    if (valid) { 
     cout << "Number = " << num << endl; 
    } 
    else { 
     cout << "Invalid entry." << endl; 
    } 
    return 0; 
} 

41 행의 '0'은 무엇을 의미합니까? 이 행은 n 문자에 nextChar의 첫 문자를 뺀 문자를 할당합니까?41 번 줄의 '0'은 무엇을 의미합니까?

+0

빠른 답장을 보내 주신 모든 분들께 감사드립니다. – Brandon

답변

7

nextChar - '0'은 문자의 정수 값을 반환합니다. 예를 들어 문자 값이 '1'(ASCII 0x31) 인 경우 '0'(0x30)을 뺀 값이 1이됩니다. ASCII 값 '0'- '9'가 연속되므로이 기술이 효과적입니다.

+1

내가 아는 모든 코드 세트는 10 자리 10 진수를 연속으로 유지합니다. 알파벳을 연속적으로 유지하지 않는 EBCDIC조차도 마찬가지입니다. –

+0

숫자에서 숫자를 가져 오는 코드는 문자 집합과 독립적입니다. 언어는 '0'에서 '9'까지 연속적임을 보장합니다. –

5

nextChar에서 참조되는 숫자 (ASCII로 표시)를 실제 값으로 변환합니다. 따라서 ASCII 값이 '5'인 경우 '5'에서 '0'을 뺀 값이 5가됩니다.

이 변환을 사용하면 키보드를 통해 입력 한 값에 대해 수학 연산을 수행 할 수 있습니다.

2

숫자에 해당하는 ASCII 코드를 숫자 자체로 변환합니다.

따라서 문자는 이며, 번호는 1입니다. 다른 숫자에도 마찬가지입니다.

1

'0'은 0 문자 (즉 48)의 ASCII 코드를 반환합니다. 7 + '0'= 7 + 48 = 55

3

앞으로는 (예 : 7) 숫자 값 (예 : 7)과 ASCII 동등한 값 (here을 보면 알 수 있듯이 55입니다) 귀하의 질문에 최소한의 양의 코드를 적어보십시오.

'0'은 ASCII이고 0은 잘 0이라는 점에서 '0'은 0과 다릅니다. ASCII standard을 살펴보십시오. 캐릭터는 '0'값 (48) 라인입니다

n = nextChar - '0'; 

은 쉽게 라인이에 숫자의 ASCII 표현을 변환의 일종을하고있다

n = nextChar - 48 

로 기록 된 수 실제 정수 표현.

+0

확인. 문제 없어. – Brandon

1

가정 (C)가 "0"사이 char 및 '9'의 정의에 의해

이며, 문자는 작은 정수이므로 CHAR 변수 상수 산술 식에서의 int 동일하다. 이것은 자연스럽고 편리한 입니다. 예 : c-'0 '은 0에서 9 사이의 값을 갖는 정수 표현이며 에 해당하는 문자이며'0 '에서'9 '는 c에 저장됩니다. Kernighan and Ritchie

관련 문제