Почему такой цикл не отлавливает ошибку при вводе строки? - PullRequest
1 голос
/ 28 ноября 2010
    int SelectedIndex;         
   int i = 4;
      while(SelectedIndex > i-1 || SelectedIndex < 0)
      {
       try{
       std::cout <<"please input index from 0 to " << i-1 << std::endl;
       std::cin >> SelectedIndex;
       }
       catch(std::exception& e){SelectedIndex = 999;}
      }

Почему такой цикл не отлавливает ошибку при вводе строки? Как это исправить? Я могу использовать std :: string и Boost library и reg exp.

Ответы [ 2 ]

1 голос
/ 28 ноября 2010

Предположим, что мы пытаемся прочитать целое число, используя std::cin, и определить, вводит ли пользователь вместо этого строку:

Если пользователь вводит строку, исключение будет не (поэтому ваш код не работает должным образом). Вместо этого ввод останется в буфере, а cin будет в состоянии ошибки. Следующая cin >> будет считывать то же значение из буфера в бесконечном цикле, если только вы не очистите состояние ошибки и буфер перед следующей итерацией.

См. эту статью , которая объясняет, как именно читать целое число (и что происходит, когда вместо нее вводится строка), а также как очистить состояние ошибки и буфер.

0 голосов
/ 28 ноября 2010

Потоковая библиотека не генерирует исключения по умолчанию.Сначала вы должны включить его, как в следующем примере:

#include <iostream>

int main()
{
    int number;
    std::cin.exceptions(std::ios::failbit | std::ios::badbit | std::ios::eofbit);
    std::cout << "enter a number: ";
    try
    {
        std::cin >> number;
    }
    catch(const std::exception& e)
    {
        std::cout << e.what();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...