Правильный ввод вошел в цикл проверки по крайней мере один раз после возврата из подменю - PullRequest
0 голосов
/ 23 сентября 2018

В настоящее время я пишу простое приложение, которое включает определенное меню, такое как Главное меню> Подменю> Под-подменю ... и т. Д. И я добавил проверку ввода для всех из них, чтобы предотвратить ошибку ввода, например,

while (option != '1' && option != '2' && option != '3' && option != '0')
    {
        //correction prompt
    }

В одном из моих меню, когда я вхожу в его подменю и возвращаюсь к нему.Любые входные данные, которые я пытаюсь ввести, приведут к тому, что система войдет в мой цикл проверки по крайней мере один раз, при условии, что вход является правильным или нет.

Мой код:

void passengerRecord()
{
    int again = 0;
    char option;
    do
    {
        system("CLS");
        cout << "Please tell me what you want to do." << endl;
        cout << "1. Add Passenger Record" << endl;
        cout << "2. Edit Passenger Record" << endl;
        cout << "3. Delete Passenger Record" << endl;
        cout << "0. Back to System Module Menu" << endl;
        cout << "Your choice: ";
        cin.ignore();
        if (again > 0)
            cin.clear();
        cin.get(option);
        while (option != '1' && option != '2' && option != '3' && option != '0')
        {
            system("CLS");
            cout << "Error Input! Please try again." << endl;
            cout << "Please tell me what you want to do." << endl;
            cout << "1. Add Passenger Record" << endl;
            cout << "2. Edit Passenger Record" << endl;
            cout << "3. Delete Passenger Record" << endl;
            cout << "0. Back to System Module Menu" << endl;
            cout << "Your choice: ";
            cin.get(option);
        }
        switch (option)
        {
            case '1':   passengerAddsa();break;
            case '2':   passengerEditsa();break;
            case '3':   passengerDeletesa();break;
            case '0':   cout << "Redirecting back to module menu..."; 
                        cin.ignore();break;
            default: cout << "Exception error occurred!";
        }
        again++;
    } while (option != '0');

}

Пока яВы вошли в одно из его подменю (добавить, отредактировать, удалить) и вернуться сюда (либо в другую функцию, используя cin.get () и перейти к возврату; или в конец функции), следующий ввод, который я ввожу дляэто меню войдет в цикл проверки как минимум один раз.Эта ситуация произошла только во второй раз ++ доступ к этому меню, при первом доступе нет проблем

Метод, который я пробовал: 1.) cin.ignore (), он бесполезен и просто требует от меня вводабольше линии.2.) cin.clear (), разницы не вижу.Вероятно, это не имеет ничего общего с буфером cin 3.) Только запустите метод 1,2 после второго раза в меню, с again ++ и if (again>0) //syntax, не помогая.

Я сжал то, что яВыучил раньше, но не повезло, не могу найти подобную проблему.Спасибо за любую помощь, спасибо.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Хм, единственная уверенность: если вы используете cin до вызова get (), вам может потребоваться очистить буфер и очистить флаги (пример ниже):

#include<iostream>
#include <vector>
using namespace std;
void passengerRecord(){
    char option;
    //Uncomment the below if cin was use prior to this function and not safely emptied.
    //cin.ignore(INT_MAX, '\n');//Ignore with delimiter newline
    //cin.clear();//Clear flags in cin
    do
    {
        //system("CLS");//Commented to display data;
        cout << "Please tell me what you want to do." << endl;
        cout << "1. Add Passenger Record" << endl;
        cout << "2. Edit Passenger Record" << endl;
        cout << "3. Delete Passenger Record" << endl;
        cout << "0. Back to System Module Menu" << endl;
        cout << "Your choice: ";
        cin.get(option);
        cin.ignore(INT_MAX, '\n');//Ignore with delimiter newline
        cin.clear();//Clear flags in cin
        while (option != '1' && option != '2' && option != '3' && option != '0')
        {
            system("CLS");
            cout << "Error Input! Please try again." << endl;
            cout << "Please tell me what you want to do." << endl;
            cout << "1. Add Passenger Record" << endl;
            cout << "2. Edit Passenger Record" << endl;
            cout << "3. Delete Passenger Record" << endl;
            cout << "0. Back to System Module Menu" << endl;
            cout << "Your choice: ";
            cin.get(option);
            cin.ignore(INT_MAX, '\n');//Ignore with delimiter newline
            cin.clear();//Clear flags in cin
        }
        switch (option)
        {
            case '1':
                cout << "passengerAddsa();" << endl;
                break;
            case '2':
                cout << "passengerEditsa();" << endl;
                break;
            case '3':
                cout << "passengerDeletesa();" << endl;
                break;
            case '0':
                cout << "Redirecting back to module menu...";
                cin.ignore(INT_MAX, '\n');//Ignore with delimiter newline
                cin.clear();//Clear flags in cin
                break;
            default:
                cout << "Exception error occurred!";
        }
    } while (option != '0');
}
int main() {
    passengerRecord();
    return 0;
}
0 голосов
/ 23 сентября 2018

Решить проблему, запустив cin.ignore() только при первом доступе

void passengerRecord()
{
int again = 0;
char option;
do
{
    //menu syntax
    //.
    //.
    if (again == 0) // only run when it's first time access during this call
        cin.ignore();
    while (option != '1' && option != '2' && option != '3' && option != '0')
    {
        //error input correction
    }

    //proceed to sub-menu

    again++; // increment or again = 1; to indicate the menu had been accessed during this call
} while (option != '0');

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...