6

非常に狭い範囲の数値 (通常は 1 ~ 10) を含む変数を使用することが多く、int または short の代わりに char データ型を使用して、使用するメモリの量を最小限に抑えたいと考えています。cin で値を同等の ASCII に変換したり、一重引用符を使用したりせずに、値を char 変数に変換したいと考えています。つまり、次のとおりです。

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

char selection;

cin>> selection;

if (selection == 1) return 1;

等...

これを行う一般的な方法はありますか?繰り返しますが、一重引用符は使用したくありません。

ありがとう

4

4 に答える 4

4

ちょっとしたユーティリティ関数を作成できます:

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);
于 2013-04-22T07:09:41.507 に答える
3

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;
于 2013-04-22T07:05:25.180 に答える
1
char selection;
cin >> selection;
selection -= '0';
于 2013-04-22T07:02:02.103 に答える
-1

多分あなたは試してみるべきです

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

これはあなたの状況下で最も簡単な方法です

于 2013-04-22T06:58:24.020 に答える