2010-06-22 2 views
3

Как преобразовать символ в целочисленное значение? Например, я пытался читать «А» как 1, «В» как 2 и так далее. Я попытался сравнить символ с каждой буквой в алфавите и вернуть соответствующее значение.Как получить целочисленное значение от символа?

int intvalue(char letter) 
{ 
if(letter == "A") 
    return 1; 
else if(letter == "B") 
    return 2; 
else if(letter == "C") 
    return 3; 
else if(letter == "D") 
    return 4; 
else if(letter == "E") 
    return 5; 
else if(letter == "F") 
    return 6; 
else if(letter == "G") 
    return 7; 
else if(letter == "H") 
    return 8; 
else if(letter == "I") 
    return 9; 
else if(letter == "J") 
    return 10; 
else if(letter == "K") 
    return 11; 
else if(letter == "L") 
    return 12; 
else if(letter == "M") 
    return 13; 
else if(letter == "N") 
    return 14; 
else if(letter == "O") 
    return 15; 
else if(letter == "P") 
    return 16; 
else if(letter == "Q") 
    return 17; 
else if(letter == "R") 
    return 18; 
else if(letter == "S") 
    return 19; 
else if(letter == "T") 
    return 20; 
else if(letter == "U") 
    return 21; 
else if(letter == "V") 
    return 22; 
else if(letter == "W") 
    return 23; 
else if(letter == "X") 
    return 24; 
else if(letter == "Y") 
    return 25; 
else if(letter == "Z") 
    return 26; 

}

я получил "Ошибка: ISO C++ запрещает сравнение между указателем и целое". Кто-нибудь знает, как это исправить? Или еще лучше, по-другому? Я чувствую, что моя вышеописанная функция очень грубая.

ответ

9

Вы должны использовать символьные литералы, а не строковые литералы, например,

if (letter == 'A') 
      ^note the single quotes 

Тем не менее, если вы готовы считать, что вы работаете в системе с помощью набора ASCII символов, вы можете просто использовать арифметику :

int charIndex = (letter - 'A') + 1; 

В наборе символов ASCII буквы имеют последовательные индексы, поэтому это работает. Это может не работать с другими наборами символов.

+1

Я думаю, что в этот день и возраст, если есть какое-либо предположение, которое можно сделать об окружающей среде, оно полагается на ASC II. Каждое допущение, которое мы избегаем, увеличивает сложность системы, поэтому в какой-то момент мы должны найти баланс, мы должны найти простую общую отправную точку. – wilhelmtell

1

Попробуйте это:

return letter - 'A' + 1; 

(Хотя вы можете обрабатывать letter вход вне диапазона)

Обратите внимание, что char это один символ, который использует одиночные кавычки: 'A'. Строки имеют несколько символов и используют двойные кавычки: "ABC".

Вы можете обрабатывать символы как целые числа (их значения ascii) и манипулировать ими.

1

Символы и их значения целых чисел ASCII являются взаимозаменяемыми. Значение ASCII персонажа минус 'A' сек значение ASCII будет 0, так что добавление 1 даст вам 1:

return letter - 'A' + 1; 

Технически вы также можете просто вычесть '@' (символ перед «А» в таблице), но я думаю, это, вероятно, менее понятно. Ваша проблема в том, что вы использовали "A" вместо 'A'; бывший является строкой (технически это указатель на символ), в то время как последний одиночный символ

+0

'письмо - 'A' + 1'! =' Письмо - 'B''. В конце концов, сложение и вычитание имеют одинаковый приоритет. –

+0

@Ben У меня было такое чувство, что это было неправильно, я просто занимался математикой в ​​голове. Исправлена –

4

В С ++ charявляется число. Поэтому нет необходимости в сложном методе, таком как выше: вы можете просто использовать char напрямую. Если вы хотите сделать это на основе с А = 1, как показано выше, то вы можете сделать:

int intValue(char value) 
{ 
    return (value - 'A') + 1; 
} 

Что касается ошибки, вы получаете в C/C++, в двойные кавычки строка является char* (или, точнее, char[], но разница здесь не важна). Вот почему вы получаете ошибку: вы пытаетесь сравнить между char и char*.

1

Более переносимая реализация включает поиск массив символов и с использованием индекса в качестве значения:

int Value_From_Char(char c) 
{ 
    static const char valid_letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    const std::string letter_str(valid_letters); 

    // Search the letters for the given char. 
    std::string::size_type position = 0; 
    position = letter_str.find(c); 
    int result = 0; 
    if (position == std::string::npos) 
    { 
    result = -1; 
    } 
    else 
    { 
    result = (int) position; 
    } 
    return result; 
} 

Эта функция будет работать с форматами UTF, а также. Этот метод не делает предположений о последовательности сортировки.

0

Возможный подход просто использует явное приведение из char к int:

#include <iostream> 

int main() 
{ 
    char c; 
    std::cout << "Enter a character: "; 
    std::cin >> c; // for more than one chars you may need to use getline() or ignore() 

    std::cout << "ASCII value of: " << c << ", is: " << int(c) <<".\n"; 
} 

Вход:

p

Выход:

ASCII value of: p, is: 112.

Смежные вопросы