vendredi 20 octobre 2017

C++ : if condition is evaluted with bad input (float) despite supposedly checking for it with cin.clear() and cin.ignore()

So, I thought I understood handling bad input with cin.clear() and cin.ignore(), like it is explained here, but in the following example

#include <iostream>
#include <limits>
using namespace std; //I know that this isn't good practice.

int main () {
    int a, b;

    while (cout << "Input some int: " && !(cin >> a)) {
        cout << "Wrong datatype!\n";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    while (cout << "Input some int: " && !(cin >> b)) {
        cout << "Wrong datatype!\n";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }

    if (a > 1) cout << "Some event.\n";
    if (b > 1) cout << "Some other event.\n";

    return 0;
}

the behavior I want is only present when the unwanted input is some character. So if I enter x and y, I will again be asked for two ints and get the appropriate outputs, same if I enter a char and an int two times.

However: If I input, say, 2.3, I will get

Input some int: Wrong datatype!

but won't have a chance to correct my input, since the result invariantly outputs "Some event." The second prompt just accepts the float right away.

Sorry, if the solution to this is obvious, I had no luck searching for it so far. I'd be thankful if you point me in the right direction.

Aucun commentaire:

Enregistrer un commentaire