Integer validation for input

前端 未结 3 839
忘掉有多难
忘掉有多难 2020-11-27 21:07

I tried to prompt user for input and do the validation. For example, my program must take in 3 user inputs. Once it hits non-integer, it will print error message and prompt

相关标签:
3条回答
  • 2020-11-27 21:49

    Your question did get myself into other issues like clearing the cin on fail() --

    double read_input()
    {
    double input;
    int count = 0; 
    bool valid = true;
    while(count != 3) {
        cout << "Enter number: " ;
        //cin.ignore(); 
        cin >> input; 
        if(cin.fail())
        {
            cout << "Wrong Input" <<endl;
            cin.clear(); 
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
        }
        else 
                count++;
    }
    return input;
    }
    
    0 讨论(0)
  • 2020-11-27 21:58

    The problem is in the while condition

    bool valid = true;
    while(valid){
    

    You loop until you get a non valid input, this absolutly not what you want! loop condition should be like this

    bool valid = false;
    while(! valid){ // repeat as long as the input is not valid
    

    Here is a modified version of your read_double

    double read_input()
    {
        double input;
        bool valid = false;
        while(! valid){ // repeat as long as the input is not valid
            cout << "Enter number: " ;
            cin >> input;
            if(cin.fail())
            {
                cout << "Wrong input" << endl;
    
                // clear error flags
                cin.clear(); 
                // Wrong input remains on the stream, so you need to get rid of it
                cin.ignore(INT_MAX, '\n');
            }
            else 
            {
                valid = true;
            }
        }
        return input;
    }
    

    And in your main you need to ask for as may doubles as you want, for example

    int main()
    {
        double d1 = read_input();
        double d2 = read_input();
        double d3 = read_input();
    
        cout << "Numbers entered are: " << d1 << ", " << d2 << ", " << d3 << endl;
    
        return 0;
    }
    

    You may also want to have a loop where you call read_double() and save the returned values in an array.

    0 讨论(0)
  • 2020-11-27 22:05

    When the reading fails, you set valid to false, so the condition in the while loop is false and the program returns input (which is not initialized, by the way).

    You also have to empty the buffer before using it again, something like:

    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    double read_input()
    {
        double input = -1;
        bool valid= false;
        do
        {
            cout << "Enter a number: " << flush;
            cin >> input;
            if (cin.good())
            {
                //everything went well, we'll get out of the loop and return the value
                valid = true;
            }
            else
            {
                //something went wrong, we reset the buffer's state to good
                cin.clear();
                //and empty it
                cin.ignore(numeric_limits<streamsize>::max(),'\n');
                cout << "Invalid input; please re-enter." << endl;
            }
        } while (!valid);
    
        return (input);
    }
    
    0 讨论(0)
提交回复
热议问题