2014-04-07 2 views
2

즉, ASCII 테이블을 기반으로 '0'에서 '9'까지의 범위에서"숯불 수"를 정수로 변환하지 않고 int로 변환하는 방법은 무엇입니까? (C++에서)

어떻게 0에서 9까지의 정수로 변환 할 수 있습니까?

char a = '6'; 
int b = a-48; 

이미 이러한 부분 주위에 떠있다,하지만 난 매직 넘버를 사용하지 않고 이것에 대해 갈 수있는 다른 방법이 있는지 궁금 해서요 :

해결책 등? '0' 이후

+0

'strtol'사용은 어떻습니까? –

답변

6

48이 보장되지 않지만 숫자가 연속으로 보장, 당신은 a-'0'를 사용할 수 있습니다. 수와

+0

그래도 그건 어떤 식 으로든 매직 넘버입니다 :) – jrok

+0

"magic char"? lol – HelloMyNameIsRay

+0

이것은 숙제를위한 것이지만 실제로는 받아 들여질 수 있다고 생각하십니까? 분명히 당신은 수업에 들지 않지만, 산업 표준 인 idk 사이에서는 괜찮을 거라고 생각합니까? – HelloMyNameIsRay

0

빼기 ASCII 제로 :

char a = '2'; 
int b = a-'0'; 

당신이 '0'을 사용할 수없는 경우, 어떻게 부정 행위의 종류는? 그것은 문자가 아닌 문자 포인터의 경우

(int)(a + 2) % 10; 
0

, 당신은이 작업을 수행 할 수 있습니다

#include <string> 
#include <sstream> 

int charToInt(char c) { 

    // initialize a buffered stream with a 1-character string 
    std::stringstream ss(std::string(1,c)); 

    // read an int from the stream 
    int v; 
    ss >> v; 
    return v; 

} 

: 당신이 정말로 원하는 경우

int convert (char x) 
{ 
    return (int(x) - int('0')); 
} 
+0

캐스트가 필요합니까? –

+0

@ThomasMatthews : 아니, 캐스트는 필요하지 않습니다. –

1

, 당신은이 같은 stringstream을 사용할 수 있습니다 변환을 수행하는 가장 간단한 방법은 아니지만 "마법"숫자 또는 문자와 관련된 구현 세부 정보를 볼 수는 없습니다. caracter가 숫자가 아닌 경우에도 오류 처리 (예외 발생)가 발생합니다.

반면에 문자 c'0'..'9' 범위에 있다는 것을 확실히 알고 있다면 c - '0'을 사용하지 않는 이유는 알 수 없습니다.

또 다른 해결책은 c & 0xf으로 c - 48을 교체하는 것입니다,하지만 여전히 매직 넘버를 포함하고 c - '0'

+0

플랫폼이 비 ASCII 문자 세트를 사용하는 경우에도 해당 문자 세트의 숫자가' '0'부터 시작하여 연속적이지 않으면 C++이 아닙니다. 실행 문자셋에 대한 요구 사항입니다. –

+0

@ Steve Jessop : 나는 그것을 모른다고? 하지만 명령을 받았더라도 소스 파일에서''0 ''이 목표 코드 포인트가 아닌 ascii 48로 해석 될 수 있기 때문에 크로스 컴파일 할 때 문제가 발생합니다. – Antoine

+2

소스는 표준입니다. [lex.charset] 위의 10 진수 목록에서 '0'이후의 각 문자 값은 이전의 값보다 큰 값이어야합니다. 소스 문자 세트와 실행 문자 세트 [lex.phases] 사이의 차이로 인해 크로스 컴파일 할 때 아무런 문제가 없습니다. "각 소스 문자 세트 구성원은 실행 문자 세트의 구성원으로 변환됩니다." 그래서''0 '' * 항상 *은 실행 집합에서 숫자 '0'의 값을 의미합니다. 물론 원본이 잘못된 인코딩으로 잘못 해석 된 경우 문제가 발생할 수 있습니다. –

1

는 ASCII 표가 진수 방식으로 주문한 것보다 덜 읽을 수있는, 그래서 실수로 숫자 문자를 변경하는 것은 매우 쉽다 값 또는 다른 것들을 낮추려면 대문자로 변경하십시오.

숫자가 0x30에서 시작되고 0x30 = 0, 0x31 = 1, 0x32 = 2 등으로 시작될 때 실제 값을 얻으려면 0x30을 제거해야합니다 값.

char number='2'; 
int numberValue = (int)number - 0x30; /* you can rest the '0' value too */ 

마찬가지로 int를 char로 변환하는 것은 동일하므로 그냥 0x30을 추가하십시오.

int numberValue=5; 
char number = (int)numberValue +0x30; /* or add '0' to your var */ 
+0

더 상징적이고 읽기 쉬운 방법은 문자에서 '0'을 뺍니다. 이것은 다른 문자 집합에 대해 더 이식성이 있습니다. –

관련 문제