为什么这样的循环在输入字符串时没有捕获错误?

时间:2010-11-28 01:22:41

标签: c++ visual-studio visual-studio-2008 boost

    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库以及reg exp。

2 个答案:

答案 0 :(得分:1)

假设尝试使用std::cin读取整数并检测用户是否输入了字符串:

如果用户确实输入了字符串,则会抛出的异常(这就是您的代码无法按预期工作的原因)。相反,输入将保留在缓冲区中,cin将处于错误状态。除非在下一次迭代之前清除错误状态和缓冲区,否则下一个cin >>将在无限循环中从缓冲区读取相同的值。

参见this article,它解释了如何读取整数(以及输入字符串时会发生什么)以及如何清除错误状态和缓冲区。

答案 1 :(得分:0)

默认情况下,流库不会抛出异常。您必须首先启用它,如下例所示:

#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();
    }
}