为什么我的If / Else语句块没有完全执行?

时间:2015-02-27 07:34:31

标签: c++

我为我的CS课做了一个简单的项目。目标是让一个人输入他们购买的每种水果(苹果,香蕉,橙子)的数量,并且程序计算总数并在最后显示发票。我的教授希望我们还包括一个输入检查,以验证输入是0到100之间的数字。为此,我有这部分代码。

string name;

int apples, oranges, bananas;
int FRUIT_MAX = 100; 
int FRUIT_MIN = 0; 
float appleCost, orangeCost, bananaCost,
    subTotal, tax, total;

cout << "Welcome to Bob's Fruits, what is your name..." << endl;
getline(cin, name);

cout << "How many apples would you like" << endl;
cin >> apples;
cout << endl;

//checking if user entered a number for apples
if (apples >= FRUIT_MIN && apples <= FRUIT_MAX)
{
    cout << "Thanks" << endl;
}
else //makes the user retype entry if invalid
{
    cout << "Please input a number thats 0 or greater than 0. " << endl;
    cin >> apples;
    cout << endl;
}

cout << "How many oranges would you like" << endl;
cin >> oranges;

    if (oranges >= FRUIT_MIN && oranges <= FRUIT_MAX) //checking to see if number is good
        cout << "Thanks" << endl;
    else //makes the user retype entry if invalid
    {
        cout << "Please input a number thats 0 or greater than 0." << endl;
        cin >> oranges;
        cout << endl;
    }

cout << "How many bananas would you like" << endl;
cin >> bananas;

    if (bananas >= FRUIT_MIN && bananas <= FRUIT_MAX)
        cout << "Thanks";
    else
    {
        cout << "Please input a number thats 0 or greater than 0."; 
        cin >> bananas; 
        cout << endl;
    }

当我输入介于0到100之间的值时,我会收到正确的&#34;感谢&#34;输出,然后它继续下一个问题。当我输入0-100之外的数字时,else语句会成功触发,程序会询问0-11之间的数字。

问题是输入信件时。如果输入了一个字母,程序将跳过每个剩余的行,忽略任何其他cin命令,并显示带有所有负数的格式化发票。任何想法为什么会发生这种情况?

3 个答案:

答案 0 :(得分:2)

当cin获得无效值时,它会设置一个failbit。

int n;
cin >> n;
if(!cin)
{
    //not a number, input again!
}

您需要使用cin.ignore()以便输入“重置”并再次请求输入。

答案 1 :(得分:1)

您可以将cin部分更改为

while (!(cin>>apples)) {
    cout<<"Type Error"<<endl;
    cin.clear();
    cin.sync();
}

答案 2 :(得分:0)

问题是您没有检查输入的正确类型。

你的apples变量是Int。因此,只要用户输入Int,一切都会好的。

但如果他或她进入Char,会发生什么? 答案是,在我之前提到的那个人之一就是cin操作会失败。

你能做些什么来防止或更好地说出处理这种情况:

#include<iostream>
using namespace std;

int main(int argc , char** argv)    {

    int apples = 0; //Its always good to initialise a var with a value

    cout << "Please enter a number: " << endl;
    cin >> apples;

    if(!cin) {
        cout << "Not a number!" << endl;
        // Handle the error
    }
    else  {
        cout << "A number was entered" << endl;
    }
    return 0;
}

您也可以使用 cin.fail(),而不是检查!cin ,如果最后一次cin操作失败,这将是真的。

如果您想了解更多关于 cin 或genrell中的输入流的信息,我建议您查看C++ reference