2013-04-22 31 views
4

我發現自己經常使用包含非常小的數字範圍(通常爲1到10)的變量,並且希望通過使用char數據類型,而不是int或甚至短。我想cin值到我的char變量,而不用將cin轉換成它的ASCII等價物並且不使用單引號。即,執行以下操作:C++如何將char當作數字而不是字符

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

char selection; 

cin>> selection; 

if (selection == 1) return 1; 

等等

是否有這樣做的一種常見的方式?再次,我不想用單引號。

感謝

+4

你擔心節省了約3個字節的內存爲本地變量在執行控制檯I/O的程序中? – 2013-04-22 06:58:44

+0

我認爲你不能。你必須用'0'來減去它。沒有辦法,你可以用cin來避免這種情況>> char – 2013-04-22 07:00:19

+1

從'char'到實際的'int'的轉換代碼至少需要2個字節,我可以向你保證。更可能需要5個字節。 – 2013-04-22 07:06:06

回答

-1

也許你應該試着

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

這是根據您的具體情況的最簡單的方法

+1

用戶將很難選擇選項10. – 2013-04-22 07:01:13

1
char selection; 
cin >> selection; 
selection -= '0'; 
+1

大約10? – gkovacs90 2014-08-25 14:15:34

3

有挽救三個字節(或零是沒有意義的,因爲它很可能無論如何,編譯器會對齊堆棧...),並使您的代碼複雜化以讀取數字。只要正常進行,並將重點放在節省記憶的地方(如果你不知道它的重要性,那可能沒有關係)。

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; 
+0

令人驚訝的是,如果你是第一個發佈正確/有用的答案在這樣一個瑣碎的主題:)讓我們假設措辭有人在錯誤的腳o.O – sehe 2013-04-22 07:06:27

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; 
} 

您可以使用它像這樣:

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

這很麻煩。我覺得'贊同這個'非常非常有爭議。無論如何,+1努力。也許它會教導OP /其他人關於運用一點巧思解決問題。 – sehe 2013-04-22 07:12:10

+0

它會保存OP寫到的三個寶貴字節嗎?嗯,我不知道C++編譯器是否可以優化對象構造。 – 2013-04-22 07:33:59

+0

@Joker_vD是的,他們可以優化它。無論如何,他們的方式我理解OP的擔心是他們的數據結構包含這樣的'char's並且想要加載到它們中,並且局部變量'char'就是一個例子。當然,如果最初的目標實際上是在棧上爲本地var保存3個字節,那麼上面的內容就毫無意義(就像其他任何東西一樣,BTW)。 – Angew 2013-04-22 07:36:48

相關問題