Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
#1

std::cin & switch case - C++

17.06.2012, 18:49. Просмотров 1163. Ответов 8
Метки нет (Все метки)

Всем привет. Вообщем проблема такая:

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 не обрабатывает ее ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2012, 18:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос std::cin & switch case (C++):

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream - C++
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &) - C++
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в пользовательский тип? Ведь мы заранее не можем...

Оптимальная конструкция switch-case-while / while-switch-case - C++
Имеется конструкция типа: switch() { case 1: while() { ... }

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) - C++
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H #include &lt;string&gt; class A { ...

Не работает std::cout || std::cin - C++
#include &quot;Account.h&quot; #include &lt;string&gt; #include &lt;iostream&gt; using std::cout; Account :: Account(int startBalance) { ...

Switch case внутри switch case - C++
Привет всем! Нужна помощь. Пишу калькулятор с консольным меню. Так вот, используется цикл while, внутри которого у меня switch...

8
zss
Модератор
Эксперт С++
6566 / 6128 / 2021
Регистрация: 18.12.2011
Сообщений: 15,975
Завершенные тесты: 1
17.06.2012, 19:15 #2
Цитата Сообщение от Destreee Посмотреть сообщение
если вводить букву то int становится негативным числом,
Не так. При вводе числа буква считается разделителем, а поскольку впереди цифр не вводите,
то получается ноль.
0
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
17.06.2012, 19:22  [ТС] #3
Есть идеи как решить проблему ?
Я сам проверял через std::cout что если ввести букву вместо цифры , выведет рандомное негативное число. У меня так по крайней мере.

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

ЗЫ: Собсно я пытаюсь сделать валидацию )))
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 19:40 #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;
    }
}
0
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
17.06.2012, 19:54  [ТС] #5
С чаром я знаю что будет работать, в моей ситуации нужен именно int. Других решений нету ? Подозреваю что это глюк cin'a
0
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
17.06.2012, 19:55 #6
А char в int преобразовать что мешает?
C++
1
int i = ch - '0';
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
17.06.2012, 20:30 #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.
вроде сами себе противоречите.
0
darkknight2008
62 / 62 / 6
Регистрация: 16.10.2011
Сообщений: 200
17.06.2012, 20:35 #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 - сообщение, которое будет запрашивать ввод.
А далее будет идти цикл пока мы не сделаем верный ввод.
0
Destreee
0 / 0 / 0
Регистрация: 16.06.2012
Сообщений: 10
17.06.2012, 21:08  [ТС] #9
а так вот в чем проблема ) теперь ясно =)
to Zort: Я имел ввиду что обрабатывает не правильно.
0
17.06.2012, 21:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2012, 21:08
Привет! Вот еще темы с ответами:

switch-case, как писать в самом case - C++
Такс дело вот в чём,прога работает всё хорошо,вот только мне не нравится как записваю страны в кейсе,можно ли каким-нибудь образом писать в...

Error C2664: std::vector<_Ty>::push: невозможно преобразовать параметр 1 из 'double' в 'const std::string &' - C++
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;sstream&gt; #include &lt;string&gt; using namespace std; int main() { string...

Error: cannot bind 'std::basic_ostream<wchar_t>' lvalue to 'std::basic_ostream<wchar_t>&&'| - C++
Ругается на строку Log&lt;&lt;StripXML(__PRETTY_FUNCTION__)&lt;&lt;std::endl;. Функция такая: std::string StripXML ...

(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const& - C++
astxx::manager::connection::connection(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned short); ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.