2012-02-13 3 views
3

숫자를 영문으로 변환하는 코드를 작성하려고합니다. 예를 들어 1은 'A', 2는 'B', 3은 'C'등입니다. Im은 26 if 문을 쓰려고 생각하고 있습니다. 이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다 ...C++에서 숫자를 영문으로 변환

고마워요!

+2

당신은뿐만 아니라'switch' 문에 대해 읽어보십시오. 이 경우에는 최적이 아니지만 많은 경우 if 문이 커다란 체인을 대체하는 데 적합합니다. – MSalters

답변

18

글자 배열을 사용하십시오. 당신은 그들이 다음 연속이다 ASCII 문자 세트를 사용하여 신뢰할 수있는 경우가 종종이 사실을, 예를 들어, 의지 할 수있는 경우

char nth_letter(int n) 
{ 
    assert(n >= 1 && n <= 26) 
    return "abcdefghijklmnopqrstuvwxyz"[n-1]; 
} 
+0

내 게시물에 응답 해 주셔서 감사합니다. 물론 그것은 저와 같은 질문을하는 모든 사람들에게 도움이 될 것입니다. – Bhabes

+0

이것이 문제를 해결하면 가장 좋은 대답으로 받아 들여야합니다. – Amol

7

당신은

char intToAlphabet(int i) 
{ 
    return static_cast<char>('A' - 1 + i); 
} 

을 변환 할 수 있습니다 특정 대상에 대해 컴파일러 플래그 또는 유사 항목을 설정할 수 있으며이 특정 빌드에이 코드를 사용할 수도 있습니다.

그렇지 않으면 정적 룩업 테이블을 사용하십시오 (다른 방식이 제안한 것처럼).

번호가 매겨진 입력이 범위를 벗어나서는 안되는 프로그램 변수에서 나온 것이라면 범위 확인을 "선택"하는 것이 좋습니다.

사용자가 불량 데이터를 제공 할 가능성이있는 사용자 제공 데이터에서 입력되는 경우 "정의되지 않은 동작"이 아닌 처리 방법이 필요합니다. 따라서 각 값을 검사하고 예외를 throw하거나 (사용자에게 데이터를 수정하도록 알리십시오) 잘못된 입력을 나타내는 문자를 사용해야합니다. 그

my_print(int x) 
{ 
    char symbol = (char)('A' + x - 1); 
    cout << symbol; 
} 
+3

ASCII는 신뢰할 수 없습니다. (실제로 ASCII를 사용하는 시스템은 모르지만 영문자는 라틴어 1 (아마도 가장 널리 사용되는 단일 바이트 인코딩)에서 인접하지 않습니다. 그리고 EBCDIC (IBM 메인 프레임에서 사용되는)에서 263 개의 unaccented 알파 문자가 인접하지 않습니다. –

+0

위의 코드가 작동하는지 정적으로 확인하고 그렇지 않은 경우 솔루션을 사용할 수 있습니다. 위의 코드가 작동하면 컴파일러가 거의 확실하게 인라인 할 것이며 성능이 향상 될 것입니다. 수백만 개를 수행하는 경우 차이가있을 수 있습니다. – CashCow

+0

내 게시물에 응답 해 주셔서 감사합니다. 물론 나와 같은 질문을하는 모든 사람들에게 도움이 될 것입니다. – Bhabes

1

뭔가 테이블을 사용하는 것입니다 :

char 
remap(int original) 
{ 
    static char const remap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    return original >= 0 && original < sizeof(remap) - 1 
     ? remap[ original ] 
     : '?'; // or throw, or ... 
} 
+2

영문자가 연속적이라는 보장은 없으며 사실 일부 인코딩 (EBCDIC)에서는 그렇지 않습니다. –

+0

내 게시물에 응답 해 주셔서 감사합니다. 물론 그것은 저와 같은 질문을하는 모든 사람들에게 도움이 될 것입니다. – Bhabes

2

가장 간단한 방법 같은

+0

나는 문자가 연속적인 변환이라는 것을 보장 할 수없는 "고정"버전에서 솔루션을 좋아합니다. 높은 성능의 코드가 필요하다면 범위 검사에 대한 주장을 선호합니다. – CashCow

+0

내 게시물에 응답 해 주셔서 감사합니다. 물론 그것은 저와 같은 질문을하는 모든 사람들에게 도움이 될 것입니다. – Bhabes

+0

@CashCow 그리고 어떻게 정적으로 무엇을 결정할 수 있습니까? 표의 마지막 요소에서 첫 번째 요소를 뺀 것이 표의 길이보다 작은 요소와 같다고해서 모든 중간 값이 범위에 있음을 의미하지는 않습니다. 그리고 시스템에 따라서는 실제로''A '+'와 같은 것보다 빠를 수도 있습니다. (더 오래된 시스템에서는 가능할 지 모르지만 결코 알지 못합니다.) –