简体   繁体   中英

How to Limit Input to Numbers Only

I recently created a program that will create a math problem based on the user input. By entering either 1-4 the program can generate a problem or the user can quit by entering 5. The only problem I am having is that when I enter a character the program goes into an infinite loop. What function could I use to check if the input is not a number so I can display an error message?


//CIS180 Assignment #4
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    //Declare variables.
    int num1, num2, menuNum;
    int addInput, subInput, multInput, divInput;
    int addAnswer, subAnswer, multAnswer, divAnswer;
    int addSolution, subSolution, multSolution, divSolution;
    srand(time(0));
    //Display menu.
    cout << "Menu" << endl;
    cout << "1. Addition problem" << endl;
    cout << "2. Subtraction problem" << endl;
    cout << "3. Multiplication problem" << endl;
    cout << "4. Division problem" << endl;
    cout << "5. Quit this program" << endl << endl;
    cout << "Enter your choice (1-5): " << endl;
    cin >> menuNum;
    //Loop that will provide math problems when user inputs number.
    while(menuNum != 5)
    {
        //Check if the input is valid.
        while((menuNum < 1) || (menuNum >5))
        {
            cout << "The valid choices are 1, 2, 3 , 4, and 5. Please choose: " << endl;
            cin >> menuNum;
        }
        //Generate two random numbers for addition and display output.
        if(menuNum == 1)
        {
            num1 = rand()%500 + 1;
            num2 = rand()%500 + 1;
            addSolution = num1 + num2;
            cout << setw(5) << right << num1 << endl;
            cout << setw(2) << left << "+" << setw(3) << right << num2 << endl;
            cout << setw(5) << fixed << "-----" << endl;
            cin >> addAnswer;
            //Check if the addition answer input is correct.
            if(addAnswer != addSolution)
                cout << "Sorry, the correct answer is " << addSolution << "." << endl;
            else if(addAnswer == addSolution)
                cout << "Congratulations! That's right." << endl << endl;
        }
        .
            .
            .

First off, you should detect whether your input attempt was successful: always check after reading that the read attempt was successful. Next, when you identify that you couldn't read a value you'll need to reset the stream to a good state using clear() and you'll need to get rid of any bad characters, eg, using ignore() . Given that the characters were typically entered, ie, the user had to hit return before the characters were used it is generally reaonable to get of the entire line. For example:

for (choice = -1; !(1 <= choice && choice <= 5); ) {
    if (!(std::cin >> choice)) {
         std::cout << "invalid character was added (ignoring the line)\n";
         std::cin.clear();
         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
}

The use of std::numeric_limits<std::streamsize>::max() is the way to obtain the magic number which makes ignore() as many characters as necessary until a character with the value of its second argument is found.

  1. Read a single character
  2. If this character is a digit, use it.
  3. If this character wasn't a digit, goto 1.

Actually, forget about step 2. Just check whether it was one of the digit characters you actually want ( '1' , '2' , '3' , '4' , '5' ):

char choice;

while(cin.get(choice)){
  if(choice == '5')
    break;

  switch(choice){
    default: printWrongCharacterMessage(); break;
    case '1': do1Stuff(); break;
    case '2': do2Stuff(); break;
    case '3': do3Stuff(); break;
    case '4': do4Stuff(); break;    
  }
}

您可以使用ctype.h中的isdigit

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM