2013-04-22 7 views
4

매우 작은 범위 (일반적으로 1에서 10)를 포함하는 변수를 자주 사용하며, 사용하는 메모리의 양을 최소화하고 싶습니다. int가 아닌 char 데이터 유형 또는 심지어 short. char 값을 ASCII로 변환하고 작은 따옴표로 변환하지 않고 cin 값을 cin 변수로 변환하고 싶습니다. 다음 예 :C++ 문자 대신 숫자로 문자를 바꾸는 방법

cout<< "Pick from 1 to 10."; 

char selection; 

cin>> selection; 

if (selection == 1) return 1; 

등 ...

이 일을하는 일반적인 방법이 있나요? 다시 한 번, 작은 따옴표를 사용하고 싶지 않습니다. 당신이

+4

콘솔 I/O를 수행하는 프로그램의 변수? –

+0

나는 그럴 수 없다고 생각합니다. 당신은 그것을 '0'으로 뺄 필요가 있습니다. 당신이 cin을 사용하여 이것을 피할 수는 없다. >> char –

+1

'char'에서 실제'int' 로의 변환을위한 코드는 적어도 2 바이트를 취할 것이고, 당신을 보장 할 수 있습니다. 그리고 더 많은 가능성이 5 바이트 걸릴 것입니다. –

답변

-1

컴파일러는 어쨌든 스택을 정렬합니다 ...) 코드를 복잡하게하여 숫자를 읽습니다. 그냥 정상적으로하고 문제가되는 곳에서 메모리 절약 노력을 기울이십시오 (중요한 부분을 모르는 경우 문제가되지 않을 수도 있음).

int selection; 
if(!(cin >> selection) || selection < 0 || selection > 10) { 
    // hmmm do something about it; perhaps scold the user. 
} 
place_where_it_is_getting_stored = selection; 
+1

사용자는 옵션 10을 선택하는 데 어려움을 겪습니다. –

3

는 가능성이 있기 때문에 3 바이트 (또는 제로를 저장 아무 문제가 없다 귀하의 상황에 따라 가장 쉬운 방법입니다

if (selection - '0' == 1) return 1; 

을 시도해야

감사

어쩌면
+0

놀라운 사소한 주제에 대해 정확하고 유용한 답변을 처음 게시하는 방법에 대해 놀라움을 금치 못했습니다 :) 잘못된 표현을하는 사람들이 있었다고 가정 해 봅시다. O – sehe

3
당신은 약간의 유틸리티 기능을 만들 수 있습니다

:

struct CharReader { 
    char &c; 
    CharReader(char &c) : c(c) {} 
}; 

CharReader asNumber(char &c) { 
    return CharReader(c); 
} 

template <typename T, typename Traits> 
std::basic_istream<T, Traits>& operator>> (std::basic_istream<T, Traits> &str, const CharReader &c) { 
    short i; 
    str >> i; 
    c.c = static_cast<char>(i); 
    return str; 
} 

을 할 수 있습니다과 같이 사용을 : 당신은 로컬 메모리의 약 3 바이트를 저장하는 방법에 대한 걱정

char selection; 
std::cin >> asNumber(selection); 
+0

귀찮습니다. 나는 '이것을 찬성하는 것'에 대해 매우 논쟁의 여지가 있음을 안다. 어쨌든, +1 노력. 아마도 OP/다른 사람들에게 문제를 해결할 수있는 창의력을 발휘하도록 가르 칠 것입니다. – sehe

+0

OP가 쓴 3 개의 귀중한 바이트를 저장합니까? 흠, C++ 컴파일러가 객체 생성을 최적화 할 수 있는지 궁금합니다. –

+0

@ Joker_vD 네, 그들은 그것을 최적화 할 수 있습니다. 어쨌든, 나는 OP의 관심사가 그러한'char's를 포함하고있는 데이터 구조를 가지고 있고 그 안에로드되기를 원했고, 지역 변수'char'는 단지 하나의 예라고 생각했습니다. 물론 원래 목표가 로컬 var에 대한 스택에 3 바이트를 저장하는 것이라면 위의 내용은 무의미합니다 (BTW와 마찬가지로). – Angew

관련 문제