循环跳过线

While loop skips line

本文关键字:循环      更新时间:2023-10-16

我当前具有此功能:

double GrabNumber() {
    double x;
    cin >> x;
    while (cin.fail()) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cout << "You can only type numbers!nEnter the number: ";
        cin >> x;
    }
    return x;
}

其目的是检查x是否是有效的数字,如果不是有效的,则将其返回或重复cin >> x(如果不是)。

在此功能期间称为:

void addition() {
    cout << "nEnter the first number: ";
    double a = GrabNumber();
    cout << "Enter the second number: ";
    double b = GrabNumber();
// rest of code

当我键入例如" 6 "时,当它告诉我输入第一个数字时,它接受它,但立即转到第二行,称其为错误,我什至没有输入输入。

我认为这是因为第一个输入仅接受" 6",而" "转到第二个输入返回错误。因此,while的参数必须存在问题。

如果您的输入立即成功,则不会忽略该行的其余部分,最终将进入下一个输入。可以通过简单地复制cin.ignore调用来解决。

double GrabNumber() {
    double x;
    cin >> x;
    cin.ignore(numeric_limits<streamsize>::max(), 'n'); // <--
    while (cin.fail()) {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), 'n');
        cout << "You can only type numbers!nEnter the number: ";
        cin >> x;
    }
    return x;
}

我将把此代码干燥作为练习;)

要避免这种问题,请使用getlinestod

double GrabNumber() {
    double x;
    bool ok = false;
    do
    {
        std::string raw;
        std::getline (std::cin, raw);
        try
        {
            x = stod(raw);
            ok = true;
        }
        catch(...)
        {}
    } while(!ok);
    return x;
}

在通常的情况下,使用getline获取原始字符串并在此之后解析更容易。这样,您可以检查所有想要的内容:字符数,签名位置,如果只有数字字符,等。