c ++验证数字并停止无限循环

Cas*_*Roy 2 c++ integer

我正在做一个控制台应用程序,我正在向应用程序传递一个整数,它工作正常,但如果我通过一封信,它会发疯,

int opt=0;
std::cout<<"Pick lang:"<<'\n';
std::cout<<"1.[es-ES]:"<<'\n';
std::cout<<"2.[en-US]:"<<'\n';
std::cin >> opt;

while(opt<1 || opt>2)
{
    std::cout<<"\nERROR!"<<'\n';
    std::cout<<"Pick lang again:"<<'\n';
    std::cout<<"1.[es-ES]:"<<'\n';
    std::cout<<"2.[en-US]:"<<'\n';
    std::cin >> opt;
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用isdigit()但我得到了相同的结果.谢谢

gre*_*olf 7

执行cin >>提取后,您要检查cin流是否仍然良好.如果你希望cin提取一个数字,但它会得到其他东西,例如.就像一封信,然后流将被设置为一个糟糕的状态,这就是为什么你看到它"变得疯狂".

你需要做的是输入后,检查cin是否仍然良好.如果它处于错误状态,则需要清除其标志,然后删除流中的任何垃圾数据.如果不这样做,那么cin的后续使用将无法正常运行.

以您的代码片段为例,您可以将其更改为以下内容:

int opt = 0;
bool inputGood = false;

do
{
    std::cout << "Pick lang again:" << '\n';
    std::cout << "1.[es-ES]:" << '\n';
    std::cout << "2.[en-US]:" << '\n';
    inputGood = std::cin >> opt;
    if(!inputGood)
    {  
      std::cout << "\nERROR! Invalid choice." << '\n';
      cin.clear();
      while( cin.get() != '\n' );
    }
}while(!inputGood || opt < 1 || opt > 2);
Run Code Online (Sandbox Code Playgroud)

编辑:在cin错误处理中whoops次要错误.已更正,现在应该正常工作.:)