Как сделать надежный пользовательский ввод для случая переключения?

0

Я пытаюсь сделать полностью ошибочный ввод для корпусов коммутаторов. Он не должен терпеть неудачу, если пользователь вводит неправильный номер, букву или длинную строку цифр или букв (это то, где раньше были ошибки).

Чтобы предотвратить ошибку, если пользователь вводит, например. "asdghdk3" Я попытался использовать массив, чтобы он проверял каждую букву, пока не найдет номер.

Затем я попытался превратить его в целое число для случая коммутатора. К сожалению, мой код не будет работать. У кого-нибудь есть предложения или улучшения? Спасибо.

#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: Я бы хотел, чтобы он принимал только 1, 2 или 3, а для всего остального возвращал неправильный ввод, повторите попытку.

использование пространства имен 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;
}
  • 0
    Извините, я забыл добавить, что это не работает, потому что теперь я думаю, что выбор не на самом деле номер. Чтобы это исправить, я попытался изменить выбор на число в операторах if.
  • 0
    В отредактированном коде вы сравниваете сам поток с 1, 2 и 3, а не с введенным числом! Это не верно. Просто сделайте это точно так же, как в примере из моего ответа, затем в самой внутренней части (где поток строк уже проверен по eof и напечатано «input ok»), сравните числовую переменную с 1, 2 или 3.
Показать ещё 1 комментарий
Теги:
switch-statement
fgets
cin

2 ответа

0
Лучший ответ

Прочитайте целую строку из std::cin в std::string с std::getline, а затем преобразуйте строку в целое число с помощью std::istringstream. Наконец, после преобразования проверьте, остались ли символы в потоке строк. Вот полный пример:

#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";
    }
}
  • 0
    Спасибо, это помогает. Я попытался поиграть с этим, чтобы соответствовать тому, что мне нужно, но у меня есть несколько вопросов. Является ли is.eof () 'присоединить' к eof ()? Я не пробовал использовать это раньше. И в чем разница между строкой и потоком строк?
  • 0
    eof () является функцией-членом. В этом нет никакой «привязанности», но на самом деле я не уверен, что именно вы имеете в виду.
Показать ещё 4 комментария
0

Вы должны использовать std::cin и проверить его статус:

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

    if (cin.peek() != '\n')
        // there more input, so probably an error
}
else
{
    // bad input
}
  • 0
    Спасибо, но что, если они ввели несколько букв? Это все еще сломает это.
  • 0
    приведите пример ввода, который, по вашему мнению, сломает его
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню