我正在制作一个小程序,旨在向用户询问一个介于特定范围之间的数字,并且需要确保它实际上是一个实际数字。
int main()
{
double initEstimate = 99;
int tries = 0;
do
{
tries++;
cout<<"enter value: ";
cin>>initEstimate;
if( initEstimate < -10 || initEstimate > 10 )
{
cout<<"value not in range"<<endl;
initEstimate = 99;
}
else if( cin.fail() )
{
cout<<"not a number"<<endl;
cin.ignore();
cin.clear();
initEstimate = 99;
}
if(tries == 3)
{
cerr<<"error: too many tries"<<endl;
return 1;
}
}while(initEstimate == 99);
cout<<"\n\nsuccess"<<endl;
return 0;
}
当测试输入是否在范围内时,一切工作都很好,但是,当测试输入是数字而不是其他字符时,我遇到了问题。例如,如果我在控制台中输入“ a”,则程序会立即弹出所有尝试,并输出“太多尝试错误”。我已经在网上寻找了一个解决方案,但是找不到像我这样的人。 帮助一个兄弟:)
答案 0 :(得分:1)
好吧,事实证明我只需要将cin.clear()语句放在cin.ignore()语句之前。我不知道为什么会这样,所以如果有人可以解释一下,我将不胜感激。
答案 1 :(得分:1)
当指示std::cin
读取数字,但是遇到诸如“ abakjdb
”之类的无用输入时,它将failbit
设置为true
,并拒绝更多输入。如果您std::cin.clear()
,则failbit
等将被清除(即设置为false
),并且可以进行进一步的输入。
请咨询this cppreference page,以获取有关C ++输入流如何工作的更多信息。特别是,std::cin
的类型为std::istream
,定义为std::basic_istream<char, std::char_traits<char> >
。