我为我的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
命令,并显示带有所有负数的格式化发票。任何想法为什么会发生这种情况?
答案 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。