즉, ASCII 테이블을 기반으로 '0'에서 '9'까지의 범위에서"숯불 수"를 정수로 변환하지 않고 int로 변환하는 방법은 무엇입니까? (C++에서)
어떻게 0에서 9까지의 정수로 변환 할 수 있습니까?
char a = '6';
int b = a-48;
이미 이러한 부분 주위에 떠있다,하지만 난 매직 넘버를 사용하지 않고 이것에 대해 갈 수있는 다른 방법이 있는지 궁금 해서요 :
해결책 등? '0'
이후
즉, ASCII 테이블을 기반으로 '0'에서 '9'까지의 범위에서"숯불 수"를 정수로 변환하지 않고 int로 변환하는 방법은 무엇입니까? (C++에서)
어떻게 0에서 9까지의 정수로 변환 할 수 있습니까?
char a = '6';
int b = a-48;
이미 이러한 부분 주위에 떠있다,하지만 난 매직 넘버를 사용하지 않고 이것에 대해 갈 수있는 다른 방법이 있는지 궁금 해서요 :
해결책 등? '0'
이후
이 48
이 보장되지 않지만 숫자가 연속으로 보장, 당신은 a-'0'
를 사용할 수 있습니다. 수와
그래도 그건 어떤 식 으로든 매직 넘버입니다 :) – jrok
"magic char"? lol – HelloMyNameIsRay
이것은 숙제를위한 것이지만 실제로는 받아 들여질 수 있다고 생각하십니까? 분명히 당신은 수업에 들지 않지만, 산업 표준 인 idk 사이에서는 괜찮을 거라고 생각합니까? – HelloMyNameIsRay
빼기 ASCII 제로 :
char a = '2';
int b = a-'0';
당신이 '0'을 사용할 수없는 경우, 어떻게 부정 행위의 종류는? 그것은 문자가 아닌 문자 포인터의 경우
(int)(a + 2) % 10;
, 당신은이 작업을 수행 할 수 있습니다
#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'));
}
캐스트가 필요합니까? –
@ThomasMatthews : 아니, 캐스트는 필요하지 않습니다. –
, 당신은이 같은 stringstream
을 사용할 수 있습니다 변환을 수행하는 가장 간단한 방법은 아니지만 "마법"숫자 또는 문자와 관련된 구현 세부 정보를 볼 수는 없습니다. caracter가 숫자가 아닌 경우에도 오류 처리 (예외 발생)가 발생합니다.
반면에 문자 c
이 '0'..'9'
범위에 있다는 것을 확실히 알고 있다면 c - '0'
을 사용하지 않는 이유는 알 수 없습니다.
또 다른 해결책은 c & 0xf
으로 c - 48
을 교체하는 것입니다,하지만 여전히 매직 넘버를 포함하고 c - '0'
플랫폼이 비 ASCII 문자 세트를 사용하는 경우에도 해당 문자 세트의 숫자가' '0'부터 시작하여 연속적이지 않으면 C++이 아닙니다. 실행 문자셋에 대한 요구 사항입니다. –
@ Steve Jessop : 나는 그것을 모른다고? 하지만 명령을 받았더라도 소스 파일에서''0 ''이 목표 코드 포인트가 아닌 ascii 48로 해석 될 수 있기 때문에 크로스 컴파일 할 때 문제가 발생합니다. – Antoine
소스는 표준입니다. [lex.charset] 위의 10 진수 목록에서 '0'이후의 각 문자 값은 이전의 값보다 큰 값이어야합니다. 소스 문자 세트와 실행 문자 세트 [lex.phases] 사이의 차이로 인해 크로스 컴파일 할 때 아무런 문제가 없습니다. "각 소스 문자 세트 구성원은 실행 문자 세트의 구성원으로 변환됩니다." 그래서''0 '' * 항상 *은 실행 집합에서 숫자 '0'의 값을 의미합니다. 물론 원본이 잘못된 인코딩으로 잘못 해석 된 경우 문제가 발생할 수 있습니다. –
는 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'을 뺍니다. 이것은 다른 문자 집합에 대해 더 이식성이 있습니다. –
'strtol'사용은 어떻습니까? –