سؤال

I am trying to make a completely error-proof input for switch cases. It needs to not fail if the user puts in the wrong number, a letter, or a long string of numbers or letters (This is where I have had errors before).

To prevent an error if the user inputs eg. "asdghdk3" I have tried using an array so it will check each letter until it finds a number.

I have then tried to turn it into an integer for the switch case. Sadly my code will not work. Does anyone have any suggestions or improvements? Thank you.

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{
    cout<<"Please choose the method you would like to use to evaluate the potential. Please enter 1,2 or 3:"<<endl;
    cout<<"1. my method. \n2. jacobi method. \n3. Exit programme. \nYou chose: ";

    char choice[20];
    bool k = true;

    int choice2;
    while (k == true){
        fgets(choice, sizeof choice, stdin);
        for(int j=0; j<sizeof(choice); j++){
            if (isdigit(choice[j])==true){  //I want it to check every character until it finds a number.
                choice2 = atoi(choice[j]); //changed name as now integer to be used in switch case.
                k = false;
                break; //so that it breaks out of the for loops because it has found a number
            }
            else{
                continue;
            }
        }
        cout<<"Incorrect input please try again";
    }

    cout<<"\nchoice2= "<<choice2<<endl;

    switch ( choice2 ) {
        case 1 :
            // Code
            break;
        case 2:
            // Code
            break;
        case 3:
            //code to exit programme
            break;
        default:
            // Code
            break;
    }

    return 0;
}

EDIT: I would like it to only accept 1, 2 or 3 and for everything else return incorrect input please try again.

using namespace std;

int main()
{
    string line;
    getline(cin, line);
    istringstream choice(line);
    int number;
    choice >> number;

    if (choice)
    {
        if (choice == 1)
        {
            cout << "you chose option 1\n";
            //code.....
        }
        else if (choice == 2)
        {
            cout<< "you chose option 2\n";
            //code.....
        }
        else if (choice == 3)
        {
            cout<< "you chose option 3\n";
            //code......
        }
    }
    else
    {
        cout << "input does not start with a number or is too big for an int\n";
    }
return 0;
}
هل كانت مفيدة؟

المحلول

Read a whole line from std::cin into a std::string with std::getline, then convert the line to an integer number with a std::istringstream. Finally, after the conversion, check if there are characters left in the string stream. Here's a complete example:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::string line;
    std::getline(std::cin, line);
    std::istringstream is(line);
    int number;
    is >> number;

    if (is)
    {
        if (!is.eof())
        {
            std::cerr << "input does not end with a number\n";
        }
        else
        {
            std::cout << "input ok\n";
        }
    }
    else
    {
        std::cerr << "inut does not start with a number or is too big for an int\n";
    }
}

نصائح أخرى

You should be using std::cin and checking its status:

int choice = -1;
if (cin >> choice)
{
    // you know user entered a number, check that it's in the correct range

    if (cin.peek() != '\n')
        // there's more input, so probably an error
}
else
{
    // bad input
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top