奇怪的cin行为

时间:2013-11-27 16:49:50

标签: c++ oop

经过一些建议。我申请了这些。

摘自函数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.ignorecin.clear清除它,但仍然没有发生任何事情。

任何人都可以帮助我吗?我做错了什么?

请在此处找到完整的代码:http://codepad.org/Gl2zBrn1

2 个答案:

答案 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);

确实,以及将您的信息流输入的状态。这样做。