Форум программистов, компьютерный форум CyberForum.ru

std::cin & switch case - C++

Восстановить пароль Регистрация
 
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
17.06.2012, 18:49     std::cin & switch case #1
Всем привет. Вообщем проблема такая:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while(val) { 
 
int choice;
std::cin >> choice;
 
    switch(choice) {
    case 1:  break;
    case 2:  break;
    case 3:  break;
 
    default: std::cout << "Wrong Number, You can only choose 1,2 or 3." <<endl;
           val = false;
    }
}
....
Если ввожу букву , то цикл бесконечно выводит Wrong Number, You can only choose 1,2 or 3.
Поидее если вводить букву то int становится негативным числом, почему default не обрабатывает ее ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5953 / 5558 / 1787
Регистрация: 18.12.2011
Сообщений: 14,204
Завершенные тесты: 1
17.06.2012, 19:15     std::cin & switch case #2
Цитата Сообщение от Destreee Посмотреть сообщение
если вводить букву то int становится негативным числом,
Не так. При вводе числа буква считается разделителем, а поскольку впереди цифр не вводите,
то получается ноль.
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
17.06.2012, 19:22  [ТС]     std::cin & switch case #3
Есть идеи как решить проблему ?
Я сам проверял через std::cout что если ввести букву вместо цифры , выведет рандомное негативное число. У меня так по крайней мере.

Кстати а в чем может быть проблема ? Думаю дело тут не в логике, наверное я чегото недопонимаю..

ЗЫ: Собсно я пытаюсь сделать валидацию )))
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 19:40     std::cin & switch case #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
char choice;
std::cin >> choice;
 
    switch(choice) {
    case '1':
    case '2':
    case '3':
        break;
    default: std::cout << "Wrong Number, You can only choose 1,2 or 3." <<endl;
           val = false;
    }
}
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
17.06.2012, 19:54  [ТС]     std::cin & switch case #5
С чаром я знаю что будет работать, в моей ситуации нужен именно int. Других решений нету ? Подозреваю что это глюк cin'a
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 19:55     std::cin & switch case #6
А char в int преобразовать что мешает?
C++
1
int i = ch - '0';
Venzo
 Аватар для Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
17.06.2012, 20:30     std::cin & switch case #7
Цитата Сообщение от Destreee Посмотреть сообщение
Если ввожу букву , то цикл бесконечно выводит Wrong Number, You can only choose 1,2 or 3.
странно, у меня почему-то все ок.


Цитата Сообщение от Destreee Посмотреть сообщение
почему default не обрабатывает ее ?
Цитата Сообщение от Destreee Посмотреть сообщение
Если ввожу букву , то цикл бесконечно выводит Wrong Number, You can only choose 1,2 or 3.
вроде сами себе противоречите.
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
17.06.2012, 20:35     std::cin & switch case #8
Никаких глюков нету. Все работает как и должно. Когда поток ожидает ввода цифры, а ты вводишь букву, то внутри потока ввода возникает ошибка. Вот эту ошибку и нужно обработать.
Я себе сделал такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template< class T >
T inputNumber( CHAR *msg )
{
  BOOL inputFlag;
  T num;
  do
  {
    cout << msg;
    cin >> num;
    if (cin.fail() == TRUE)
    {
      cout << "Неверный ввод.\n";
      inputFlag = FALSE;
    }
    else
      inputFlag = TRUE;
 
    cin.clear(); // Очищаем список ошибок потока
    cin.ignore(1000, '\n'); // Очищаем буфер ввода
  } while (inputFlag == FALSE);
 
  return num;
}
msg - сообщение, которое будет запрашивать ввод.
А далее будет идти цикл пока мы не сделаем верный ввод.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2012, 21:08     std::cin & switch case
Еще ссылки по теме:

C++ Не работает std::cout || std::cin
Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'| C++
C++ Switch case внутри switch case

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
17.06.2012, 21:08  [ТС]     std::cin & switch case #9
а так вот в чем проблема ) теперь ясно =)
to Zort: Я имел ввиду что обрабатывает не правильно.
Yandex
Объявления
17.06.2012, 21:08     std::cin & switch case
Ответ Создать тему
Опции темы

Текущее время: 13:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru