数字をアルファベットに変換するコードを書こうとしています。たとえば、1は「A」、2は「B」、3は「C」などとなります。私は26のif文を書くことを考えています。これを行う良い方法があるのだろうかと思います...数字をC++のアルファベットに変換する
ありがとう!
数字をアルファベットに変換するコードを書こうとしています。たとえば、1は「A」、2は「B」、3は「C」などとなります。私は26のif文を書くことを考えています。これを行う良い方法があるのだろうかと思います...数字をC++のアルファベットに変換する
ありがとう!
あなたは、彼らが連続している使用してASCII文字セットに頼ることができる場合は、時々この事実に頼ることができるなら、あなたは、例えば、
char intToAlphabet(int i)
{
return static_cast<char>('A' - 1 + i);
}
を変換することができます特定のターゲットに対してコンパイラフラグなどを設定することができます。また、このコードを特定のビルドに使用することもできます。
それ以外の場合は、静的ルックアップテーブルを使用します(他の方法が示唆しているように)。
数字の入力が範囲外になるべきではないことが分かっているプログラム変数から来た場合は、範囲チェックを「アサート」することをお勧めします。
ユーザーが不正なデータを提供する可能性のあるユーザー提供データからの入力である場合は、「未定義の動作」ではない処理方法が必要です。したがって、各値をチェックし、例外をスローするか(データを修正するようにユーザーに通知する)、または不正な入力を示すために文字を使用する必要があります。その
my_print(int x)
{
char symbol = (char)('A' + x - 1);
cout << symbol;
}
何かがテーブルを使用することになります。
char
remap(int original)
{
static char const remap[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return original >= 0 && original < sizeof(remap) - 1
? remap[ original ]
: '?'; // or throw, or ...
}
アルファベット文字が連続しているという保証はなく、実際には一部のエンコーディング(EBCDIC)ではそうではありません。 –
私のポストに応答してくれてありがとう。確かに私と同じ質問をするすべての人に役立つでしょう。 – Bhabes
最も簡単な方法のような
あなたの解決策が「静的な」バージョンで好きです。文字が連続した変換であるとは保証できません。私は、もしこれが高性能コードである必要があるならば、レンジチェックに対するアサートを好むだろう。 – CashCow
私のポストに応答してくれてありがとう。確かに私と同じ質問をするすべての人に役立つでしょう。 – Bhabes
@CashCowどのように静的に何かを決定できますか?表の最後の要素から最初の要素を差し引いたものが表の長さよりも小さいという事実は、すべての中間値が範囲内にあることを意味するものではない。システムによっては、実際に '' A '+オリジナル ''のようなものよりも速いかもしれません。 (古いシステムの方が多いかもしれませんが、わかりません) –
あなたにも 'switch'声明について読みたいかもしれません。この場合は最適ではありませんが、多くの場合、if文の大きなチェーンを置き換えるのに適しています。 – MSalters