经过一些建议。我申请了这些。
摘自函数bool getInput(int format=1)
cin>>num1>>plus>>num2>>i;
if(cin.fail()){
cout<<"\n[X][cin--fail] Oops! You entered in the incorrect format! Correct format: a+bi";
cin.clear();
cin.ignore(INT_MAX);
return false;
}
if(plus == '+' && i=='i'){
setComplex(num1, num2);
return true;
} else {
cout<<"\n[X] Oops! You entered in the incorrect format! Correct format: a+bi";
return false;
}
我还有另一个调用上述函数的函数。
void getInput_recursive(int format=1){
while(!getInput(format)){};
}
它可以正确输入。
但是当输入类似于2+3iiiii
时,就会发生一些奇怪的事情。
我的第一个猜测:也许这是由于输入缓冲区造成的。我尝试使用cin.ignore
和cin.clear
清除它,但仍然没有发生任何事情。
任何人都可以帮助我吗?我做错了什么?
请在此处找到完整的代码:http://codepad.org/Gl2zBrn1
答案 0 :(得分:2)
你的方法很好,你做的操作正确,但我认为你的订单混乱了:
第一个cin.clear();
重置标志,而不是cin.ignore(INT_MAX);
来清除缓冲区。
编辑:
我认为您需要将cin.ignore(INT_MAX);
替换为cin.ignore(INT_MAX,'\n');
如果这样做,请告诉我。
答案 1 :(得分:2)
(a)不要递归。 while (!getInput(format)) {}
会这样做,递归用于保存状态以便以后恢复,并且没有什么可以在这里恢复。
(b)您没有在false
分支
bool getInput_recursive(int format=1){
if(getInput(format) == true){
return true;
} else {
getInput_recursive(format); // here
}
}
并产生未定义的行为。
和(c)我认为你需要查找
cin.ignore(INT_MAX);
确实,以及将您的信息流输入的状态。这样做。