Question

In my simple Fraction class, I have the following method to get user input for the numerator, which works fine for checking garbage input like garbage, but will not recognize user input which starts with an integer, and is followed by garbage, 1 garbage or 1garbage.

void Fraction::inputNumerator()
{
    int inputNumerator;

    // loop forever until the code hits a BREAK
    while (true) {
        std::cout << "Enter the numerator: ";

        // attempt to get the int value from standard input
        std::cin >> inputNumerator;

        // check to see if the input stream read the input as a number
        if (std::cin.good()) {

            numerator = inputNumerator;
            break;

        } else {

            // the input couldn't successfully be turned into a number, so the
            // characters that were in the buffer that couldn't convert are
            // still sitting there unprocessed.  We can read them as a string
            // and look for the "quit"

            // clear the error status of the standard input so we can read
            std::cin.clear();

            std::string str;
            std::cin >> str;

            // Break out of the loop if we see the string 'quit'
            if (str == "quit") {
                std::cout << "Goodbye!" << std::endl;
                exit(EXIT_SUCCESS);
            }

            // some other non-number string.  give error followed by newline
            std::cout << "Invalid input (type 'quit' to exit)" << std::endl;
        }
    }
}

I saw a few posts on using the getline method for this, but they didn't compile when I tried them, and I'm having trouble finding the original post, sorry.

Était-ce utile?

La solution

Better check as follows:

// attempt to get the int value from standard input
if(std::cin >> inputNumerator)
{
    numerator = inputNumerator;
    break;
} else { // ...

Or yes: Follow recommendations to parse a complete input line combining std::getline() and std::istringstream appropriately.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top