0

コードが間違った値を返す理由がわかりません。'a' を入力すると 97 が返され、'z' が 122 が返されます。

  int main()
  {
enum Alphabet {a = 1, b = 2, c = 3,d = 4,e = 5,f = 6,g = 7,h = 8,i = 9,j = 10,k =     11,l = 12,m = 13,n = 14,o = 15,p = 16,q = 17,r = 18,s = 19,t = 20,u = 21,v = 22,w = 23,x =     24,y = 25,z = 26 };
int jon;
char input;
cout << "Enter a letter and I will tell you it's position in the alphabet ";
cin >> input;
while (!isalpha(input))
{
    cout << "Try Again.  Enter a letter and I will tell you it's position";
    cin >> input;
}
Alphabet inputEnum = static_cast<Alphabet>(input);
cout<<inputEnum;
cin>>jon;
return 0;
}
4

3 に答える 3

1

列挙型は、コンパイル時の識別子 ( ab、 などc) を整数値に関連付けます。char実行時の値 ( 、 、 など'a''b'引用'c'符に注意) を整数に関連付けません。それらはすでに整数であり、その値は実装で使用している文字セットによって決定されます。ほとんどすべての実装では、取得する値を説明する ASCII または ASCII と互換性のあるものを使用します。代わりに必要なのはマップのようです:

std::map<char,int> alphabet;
alphabet['a'] = 1;
alphabet['b'] = 2;
etc...

または、おそらく単純な関数:

int alphabet(char c)
{
    switch(c)
    {
        case 'a': return 1;
        case 'b': return 2;
        etc...
    }
}

文字セットが ASCII または ASCII 互換 (かなり安全な仮定) であると仮定したい場合は、関数をより単純にすることができます。

int alphabet(char c)
{
    if (c >= 'a' && c <= 'z')
        return c - 'a' + 1;
    else
        // c is not a lowercase letter
        // handle it somehow
}
于 2013-10-17T00:21:37.453 に答える
0

古い質問ですが、他の人がOPと同様のことをしたい場合に備えて、これを書き留めておくとよいと思いました。

私は同じ問題に遭遇しましたが、OP のように、そこに座って、長い 26 ケースのスイッチ ブロックに記入したくありませんでした。代わりに、より良い、時間を節約する方法を見つけました。

#include <ctype.h>
#include <string>

// Takes in a alphabetic char, and returns 
// the place of the letter in the aplhabet as an int.
int AlphabetCode(char _char){
    // Used to compare against _char.
    char tempChar = 'A';
    // Cycle through the alphabet until we find a match.
    for (int cnt = 1; cnt < 26; cnt++) {
        if (tempChar == toupper(_char)) {
            return cnt;
        }
        else {
            // Increment tempChar.
            // eg: A becomes B, B becomes C etc.
            tempChar++;
        }
    }
}
于 2016-04-11T21:40:02.167 に答える