Ввод принимает char, когда он должен быть строкой? - PullRequest
3 голосов
/ 06 мая 2010

Я новичок в C ++ и в любом случае делаю простую текстовую RPG. Сценарий таков: у меня есть экран приветствия с вариантами 1-3, и у меня есть простой оператор IF для их проверки, здесь:

int choice;
std::cout << "--> ";
std::cin  >> choice;

if(choice == 1) {
//..

Это отлично работает, но если кто-то введет букву в качестве выделения (вместо 1, 2 или 3), оно станет "-392493492" или что-то в этом роде и завершит работу программы. Итак, я придумал:

char choice;
std::cout << "--> ";
std::cin  >> choice;

if(choice == 1) {
//..

Это работает нормально, но когда я ввожу число, оно, кажется, полностью пропускает операторы IF. Символ "1" совпадает с числом 1?

Я получаю ошибку компилятора с этим (ISO-CPP или что-то):

if(choice == "1")

Так как же я вижу, правильно ли они ввели 1-3??

Ответы [ 6 ]

3 голосов
/ 06 мая 2010

Выбор не становится "-392493492" или чем-то еще, он начинается с этого значения (вы его не инициализировали, поэтому начальное значение не указано) и никогда не устанавливается на что-либо еще, потому что >> не удается. Вы должны проверить, что такие операторы успешны, что довольно легко сделать:

if (std::cin >> choice) {
    switch (choice) {
    case 1: // ...
    case 2: // ...
    case 2: // ...
    default: // report error
    }
}
3 голосов
/ 06 мая 2010
1 is an int
'1' is a char
"1" is a char array

Полагаю, вы хотите сравнить с '1'.

2 голосов
/ 06 мая 2010

К сожалению 1 и '1' не совпадают.

Найдите свою любимую таблицу ASCII, чтобы узнать целочисленное значение, представляющее символ «1», и вы увидите это сами: '1' сопоставлено с 49.

Есть еще одна проблема с этим кодом "" обозначает C-строку (const char*), тогда как '' обозначает один символ.

Вот ваш код переработан:

char choice = 0;
if (cin >> choice)  // check success
{
  switch(choice) // choose
  {
  case '1': {  /**/ break; }
  case '2': {  /**/ break; }
  case '3': {  /**/ break; }
  default:
    cout << choice
         << " is not a valid choice, please press 1, 2 or 3 and Enter"
         << endl;
  }
}

Я переключился на переключение, потому что это более естественно, чем цепочка else-if для общего перечисления.

1 голос
/ 06 мая 2010

выбор является символом, поэтому вы должны использовать «1» для проверки. «1» представляет строку с 1 символом в ней.

1 голос
/ 06 мая 2010

Значение в двойных кавычках интерпретируется как строка (типа char*, что несовместимо с char), тогда как в одинарных кавычках оно интерпретируется как символ:

if(choice == '1')

Целочисленное представление символа '1' не 1, а 49 (в ASCII ). Таким образом, вы также можете написать

if(choice == 49)

Кроме того, у вас должна быть ветка else для отображения сообщения об ошибке или чего-то подобного и предотвращения продолжения программы в случае ввода неверного ввода.

1 голос
/ 06 мая 2010

if(choice == '1')

И чтобы ответить на ваш вопрос, значение ascii для 1 не равно 1, но равно 49:

'1' == 49
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...