2012-02-13 399 views
3

数字をアルファベットに変換するコードを書こうとしています。たとえば、1は「A」、2は「B」、3は「C」などとなります。私は26のif文を書くことを考えています。これを行う良い方法があるのだろうかと思います...数字をC++のアルファベットに変換する

ありがとう!

+2

あなたにも 'switch'声明について読みたいかもしれません。この場合は最適ではありませんが、多くの場合、if文の大きなチェーンを置き換えるのに適しています。 – MSalters

答えて

18

文字の配列を使用してください。

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

私のポストに応答してくれてありがとう。確かに私と同じ質問をするすべての人に役立つでしょう。 – Bhabes

+0

これで問題が解決した場合は、最良の答えとして受け入れることをお勧めします。 – Amol

7

あなたは、彼らが連続している使用してASCII文字セットに頼ることができる場合は、時々この事実に頼ることができるなら、あなたは、例えば、

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

を変換することができます特定のターゲットに対してコンパイラフラグなどを設定することができます。また、このコードを特定のビルドに使用することもできます。

それ以外の場合は、静的ルックアップテーブルを使用します(他の方法が示唆しているように)。

数字の入力が範囲外になるべきではないことが分かっているプログラム変数から来た場合は、範囲チェックを「アサート」することをお勧めします。

ユーザーが不正なデータを提供する可能性のあるユーザー提供データからの入力である場合は、「未定義の動作」ではない処理方法が必要です。したがって、各値をチェックし、例外をスローするか(データを修正するようにユーザーに通知する)、または不正な入力を示すために文字を使用する必要があります。その

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

ASCIIに頼ることはできません。 (現実には、ASCIIを使用する今日のシステムは知らないし、アルファベットの文字はラテン語1(おそらく最も広く使われている1バイトエンコーディング)で連続していないし、EBCDIC –

+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 '+オリジナル ''のようなものよりも速いかもしれません。 (古いシステムの方が多いかもしれませんが、わかりません) –

関連する問題