Как получить целочисленное значение от символа? - PullRequest
3 голосов
/ 22 июня 2010

Как я могу преобразовать символ в целочисленное значение? Например, я пытался прочитать «A» как 1, «B» как 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 ++ запрещает сравнение между указателем и целым числом. Кто-нибудь знает, как это исправить? Или, что еще лучше, по-другому? Я чувствую, что моя вышеупомянутая функция очень грубая.

Ответы [ 6 ]

9 голосов
/ 22 июня 2010

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

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

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

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

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

4 голосов
/ 22 июня 2010

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

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

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

1 голос
/ 23 июня 2010

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

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-форматами.Этот метод не делает никаких предположений о последовательности упорядочения.

1 голос
/ 22 июня 2010

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

return letter - 'A' + 1;

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

1 голос
/ 22 июня 2010

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

return letter - 'A' + 1;

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

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

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

0 голосов
/ 15 июня 2017

Возможный подход - просто использовать явное приведение от 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.

...