Обработка некорректного пользовательского ввода

109
19 сентября 2021, 17:30

Есть функция для консольного приложения. Она должна возвращать 's' или 'h', если таковые символы были введены. Если же ввод не соответствует одному из них, то цикл повторяется. Проблема в том, что если было введено больше одного символа и первый символ это 's' или'h', то функция возвращает значение. Как изменить ее так, чтобы при количестве символов больше одного, значение В ЛЮБОМ СЛУЧАЕ не возвращалось?

char getChoice()
{
    char choice;
    while(choice != 'h' && choice != 's')
    {
        std::cout << "Hit or Stand?(h/s)...";
        std::cin >> choice;
        if (std::cin.fail())
        {
            std::cin.clear();
            std::cin.ignore(32767,'\n');
        }    
        std::cin.ignore(32767,'\n');
    }
    return choice;   
}
Answer 1

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

char getChoice()
{
    char choice;
    std::cout << "Hit or Stand?(h/s)...";       
    while ((std::cin >> choice  && choice != 'h' && choice != 's')
        || std::cin.peek() != '\n')
    {
        std::cout << "Hit or Stand?(h/s)...";       
        if (std::cin.fail() )
        {
            std::cin.clear();
            std::cin.ignore(32767, '\n');
        }
        std::cin.ignore(32767, '\n');
    }
    return choice;
}

std::cin.peek() выдает следующий символ буффера, но не считывает

READ ALSO
хочу создать &quot;свободную&quot; камеру с движением по осям х, у, z

хочу создать "свободную" камеру с движением по осям х, у, z

В общем у меня не выходить создать камеру которая бы двигалась по осям x, y, zУвы только по оси z

77
Указатели для создания виджетов

Указатели для создания виджетов

Почему при создании виджета нужно использовать указатель, а не переменную?

115
Почему линковщик не видит символ?

Почему линковщик не видит символ?

В начале файла dllmaincpp есть такой фрагмент кода: extern "C" HINSTANCE hAppInstance;

144
std::unique_lock не захватывает мьютекс

std::unique_lock не захватывает мьютекс

Разрабатываю имплементацию очереди задачВ классе содержатся следующие данные:

77