我正在尝试为课堂写一些基本上是小型网上商店的东西。想法是显示一定数量的库存,询问用户他/她想要多少,并在完成后显示购物车。我拥有我需要的一切,除非用户说他们想要一些浮点数,否则它会完美运行 我们应该检查所有错误输入并继续询问用户,直到输入正确的输入。我记录的是由字母和数字组成的任何条目(我知道),但是当输入小数时,它会向下舍入到最接近的整数,使用当前项目,然后跳到下一个输入机会(下一项)并立即在那里给出错误信息。
void printError(int stock, int &numberOfCopies){
cin.clear();
cin.ignore(INT_MAX, '\n');
cout << "Invalid amount" << endl << "Enter a number from 0 - " << stock ><< ": ";
cin >> numberOfCopies;
}
int getQuantity(string title, int stock){
int numberOfCopies;
cin >> numberOfCopies;
while (cin.fail() || numberOfCopies < 0 || numberOfCopies > stock){
printError(stock, numberOfCopies);
}
if (numberOfCopies == 1){
cout << endl << numberOfCopies << " copy of " << title << " has been >added to your cart" << endl;
}
else if (numberOfCopies > 1 && numberOfCopies <= stock){
cout << endl << numberOfCopies << " copies of " << title << " have >been added to your cart" << endl;
}
else if (numberOfCopies == 0){
cout << "You did not change your cart" << endl;
}
return numberOfCopies;
}
int numberOfCopies1 = getQuantity(title1, stock1);
这是我现在必须检查的错误(title1和stock1是预定义的)。我正在使用cin.fail()
来检查非整数的值,但输入小数时它不起作用。
我在这里俯瞰什么?
答案 0 :(得分:1)
当输入小数时,它向下舍入到最接近的整数,用于当前项目,然后跳到下一个输入机会(下一个项目)并立即给出错误消息
这就是流的工作方式,因此它们可以用于解析int
的任何其他分隔符或内容。如果你想把它当作一个错误 - 检查没有尾随垃圾 - 你应该使用std::getline
,之后通常很方便构建一个std::istringstream
来获取int
,检查之后没有垃圾:
std::string line;
while (getline(std::cin, line))
{
std::istringstream iss(line);
if (line >> n >> std::ws && iss.eof())
break;
...clear/ignore/prompt again...
}
getline
/ istringstream
次舞会在提示输入单个整数时与std::cin
所期望的输入量相匹配 - 如果您直接使用std::cin >> n >> std::ws && std::cin.eof()
,它只会如果std::cin
命中EOF,则失败 - 例如用户在UNIX / Linux主机上键入Control-D,在Windows上键入Control-Z等,之后他们可能无法再输入任何文本(取决于确切的操作系统)。
请注意,流式传输到float
或double
然后检查它等于自己的floor
会解决您报告的确切问题,但如果有人输入其他废话“27x” ,“27O”,你仍然会提取前导整数部分,并在下次触发错误报告......