C ++输入浮点而不是整数时输入错误

时间:2015-04-13 03:20:58

标签: c++ function validation input

我正在尝试为课堂写一些基本上是小型网上商店的东西。想法是显示一定数量的库存,询问用户他/她想要多少,并在完成后显示购物车。我拥有我需要的一切,除非用户说他们想要一些浮点数,否则它会完美运行 我们应该检查所有错误输入并继续询问用户,直到输入正确的输入。我记录的是由字母和数字组成的任何条目(我知道),但是当输入小数时,它会向下舍入到最接近的整数,使用当前项目,然后跳到下一个输入机会(下一项)并立即在那里给出错误信息。

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()来检查非整数的值,但输入小数时它不起作用。
我在这里俯瞰什么?

1 个答案:

答案 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等,之后他们可能无法再输入任何文本(取决于确切的操作系统)。

请注意,流式传输到floatdouble然后检查它等于自己的floor会解决您报告的确切问题,但如果有人输入其他废话“27x” ,“27O”,你仍然会提取前导整数部分,并在下次触发错误报告......