2013-03-20 4 views
4
#include <iostream> // cin, cout 
using namespace std; 
int main(void) 
{ 
char c[80]; 
int i, sum=0; 
cin.getline(c,80); 
for(i=0; c[i]; i++) // c[i] != '\0' 
if('0'<=c[i] && c[i]<='9') sum += c[i]-'0'; 
cout<< "Sum of digits = " << sum << endl; 
getchar(); 
getchar(); 
return 0; 
} 

나는 모든 것이 + = c [i] - '0'의 합에 대해 수용한다는 것을 이해합니다. 나는 "-'0"을 제거하고 정확한 답을주지 못했다. 왜 이런거야?누군가가 "- '0'"을 설명 할 수 있습니까? "

+4

ASCII 테이블을 보면 도움이 될만한 것을 찾을 수 있습니다. – billz

+0

나는 이것이 http://stackoverflow.com/questions/11098626/understanding-c-0의 정확한 복제본이라고 말하지 않을 것이다. 그 중 하나는''a ''- '0'입니다. 이것은 대부분 무의미한 우연의 일치이며 문자 집합에 의존합니다. 이 질문은''0 '',''9 ''에서''0 ''을 뺀 것에 대한 것입니다. 자, 거기에있는 설명 중 일부는 일반적으로이 것에 적용 가능하지만 다른 질문입니다. – jamesdlin

답변

10

문자를 해당 문자 코드 (예 : ASCII로 48 자)에서 해당 정수로 변환합니다. 따라서 문자 '0'을 정수 0으로 값을 바꿉니다. 피트 벡커 (Peter Becker)는 C와 C++의 언어 정의에 대한 주석에서 언급 한 것처럼 모든 숫자 문자는 연속적이어야합니다.

+0

와우, 매우 상세한 ** 잘못된 ** 답변! ''(질문이 닫히지 않으면 답변으로 게시했습니다.) ASCII와는 아무런 관련이 없습니다 (직접적으로는 아니지만). C 및 C++ 언어 정의 **에는''0 '-''9' '이 연속적이고 오름차순 인 값이 필요합니다. 그것은'ch - '0'을 작동하게 만든다; 그렇지 않으면 자릿수를 나타내는 문자를 나타내는 값으로 변환하는 간단하고 정상적인 메커니즘이 없습니다. ASCII **뿐만 아니라 모든 유효한 문자 인코딩 **에 대해 작동합니다. –

1

'0'은 ASCII 값 0을 반환합니다. 따라서 ASCII 값이 아닌 숫자를 사용하려면 ASCII 값 0으로 오프셋해야합니다. '1'- '0':: = 49 - 48 :: = 1 (49 및 48은 각각 1과 0의 ASCII 값입니다.)

0

그것은 정수 값을 문자로 변환 :

character | ASCII code | expression | equivalent | result 
    '0'  |  48  | '0' - '0' | 48 - 48 | 0 
    '1'  |  49  | '1' - '0' | 49 - 48 | 1 
    '2'  |  50  | '2' - '0' | 50 - 48 | 2 
    '3'  |  51  | '3' - '0' | 51 - 48 | 3 
    '4'  |  52  | '4' - '0' | 52 - 48 | 4 
    '5'  |  53  | '5' - '0' | 53 - 48 | 5 
    '6'  |  54  | '6' - '0' | 54 - 48 | 6 
    '7'  |  55  | '7' - '0' | 55 - 48 | 7 
    '8'  |  56  | '8' - '0' | 56 - 48 | 8 
    '9'  |  57  | '9' - '0' | 57 - 48 | 9 
1

0 ASCII 값 등등 1의 (49)에 대해 48이다. 이제 프로그램에서 c[80]은 문자 배열입니다. 따라서 키보드에서 1을 입력하면 컴파일러는 산술 연산을 위해 49 (ascii 값)로 처리합니다. 그래서 우리는 정수 값을 얻기 위해 ascii 값인 0 (즉, 48)을 뺄 필요가 있습니다. 이것은 문자에서 '0'을 빼거나 48을 직접 빼서 얻을 수 있습니다. 예 : sum += c[i]-'0';sum += c[i]-48;으로 바꾸면 코드도 작동합니다. 그러나 이것은 좋은 습관이 아닙니다. 희망이 도움이됩니다.

관련 문제