Как работает цикл while

157
27 января 2020, 23:20

У меня есть переменная типа char с названием entrance, пользователь должен ввести Y/N , в случае если вводится что-то иное, надо вывести сообщение об некорректности введенных данных и попросить ввести еще раз, до тех пор, пока не будет введено Y/N или y/n. У меня цикл сообщение об ошибке почему - то выводит столько, сколько неверных символов я введу, и не могу понять почему так.

Вот сам код:

char entrance;
cin >> entrance;
while((entrance != 78) && (entrance != 110) && (entrance != 89) && (entrance != 121))
{
    cout << "Неверный ввод! Следует ввести Y/N, попробуйте еще раз:";
    cin >> entrance;
    cout << "" << endl;
}

Вообще я даже не уверен в правильности такого подхода, это лишь маленькая часть большого задания по ООП. Нужно составить программу, для бронирования отеля и вот эта маленькая часть кода отвечает за продолжение работы программы, в зависимости от ввода данных.

Answer 1

Потому что в переменную entrance присваивается только первый символ,все остальные остаются в буфере входного потока и вставляются без вашего спроса,когда будет в следующий раз вызываться cin и подобные ей функции ввода. Дабы лучше все это понять можете проверить,как работает программа:

#include <iostream>
using namespace std;
int main()
{
    cin.get();
    cin.get();
}

Если введено более одного символа,то следующий cin.get() не будет ждать ввода пользователя,а возьмет символ из буфера входного потока.При чем это не отобразится в консоли.Кстати,Enter тоже является символом.

Answer 2

В вашем случае можно обойтись и goto, хотя многие говорят, что это плохой тон, но если руки прямые, то никаких проблем с этим не будет. Это обычный jmp код в ассемблере. Используется очень просто, создается label, куда мы можем в дальнейшем прыгать с помощью goto

Простой пример: если клиент вводит значение <= 0, то мы прыгаем в участок кода ErrorGO, где у нас повторно запрашивается ввод

    void foo()
    {
        int testvalue = 0;
    ErrorGO: 
        std::cin >> testvalue
        if(testvalue <= 0)
            goto ErrorGO;
    }
READ ALSO
undefined reference to `Magick::Image::Image()&#39;

undefined reference to `Magick::Image::Image()'

Подскажите, чего не хватает?

168
std::thread join - виснет [закрыт]

std::thread join - виснет [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском»

134
Причем здесь лямбда?

Причем здесь лямбда?

Анонимные делегаты в Java 8 не являются лямбда-выражениями, тк

154