How to handle wrong data type input

2019-01-01 11:41发布

问题:

In C++, how do you handle wrong inputs? Like, if the program asks for an integer, when you type a character it should be able to do something and then loop to repeat the input but the loop goes infinite when you input a character when an integer is need and vice versa.

回答1:

The reason the program goes into an infinite loop is because std::cin\'s bad input flag is set due to the input failing. The thing to do is to clear that flag and discard the bad input from the input buffer.

//executes loop if the input fails (e.g., no characters were read)
while (std::cout << \"Enter a number\" && !(std::cin >> num)) {
    std::cin.clear(); //clear bad input flag
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), \'\\n\'); //discard input
    std::cout << \"Invalid input; please re-enter.\\n\";
}

See the C++ FAQ for this, and other examples, including adding a minimum and/or maximum into the condition.

Another way would be to get the input as a string and convert it to an integer with std::stoi or some other method that allows checking the conversion.



回答2:

The top voted answer covers the solution really well.

In addition to that answer, this may help visualize what\'s going on a little better:

int main()

    int input = 1;//set to 1 for illustrative purposes
    bool cinState = false;
    string test = \"\\0\";
    while(input != -1){//enter -1 to exit
        cout << \"Please input (a) character(s): \";//input a character here as a test
        cin >> input; //attempting to input a character to an int variable will cause cin to fail
        cout << \"input: \" << input << endl;//input has changed from 1 to 0
        cinState = cin;//cin is in bad state, returns false
        cout << \"cinState: \" << cinState << endl;
        cin.clear();//bad state flag cleared
        cinState = cin;//cin now returns true and will input to a variable
        cout << \"cinState: \" << cinState << endl;
        cout << \"Please enter character(s): \";
        cin >> test;//remaining text in buffer is dumped here. cin will not pause if there is any text left in the buffer.
        cout << \"test: \" << test << endl;
    }
    return 0;    
}

Dumping the text in the buffer to a variable isn\'t particularly useful, however it helps visualize why cin.ignore() is necessary.

I noted the change to the input variable as well because if you\'re using an input variable in your condition for a while loop, or a switch statement it may go into deadlock, or it may fulfill a condition you weren\'t expecting, which can be more confusing to debug.



回答3:

Test the input to see whether or not it is what your program expects. If it is not, alert the user that the input they provided is unacceptable.



回答4:

You can check it through the ASCII value if the ascii value s between 65 t0 90 or 97 to 122 the it would be character.