C ++ Разрыв строки вводится как ввод автоматически, если вы вводите cin неожиданный ввод внутри цикла - PullRequest
0 голосов
/ 02 февраля 2019

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

Я пытался использовать std :: cin.clear ();чтобы остановить автоматический ввод переноса строки, но это не сработало.

#include <iostream>

int main() {
    while (1) {
        std::string operatorChoice;
        long int number1, number2;
        number1 = 0;
        number2 = 0;
        std::cout << "<add>, <subtract>, <divide>, <multiply>, or <exit> ";
        std::cin >> operatorChoice;
        if (operatorChoice == "exit") {
            break;
        }
        std::cout << "Number 1: ";
        std::cin >> number1;
        std::cout << "Number 2: ";
        std::cin >> number2;
        if (operatorChoice == "add") {
            std::cout << number1 << " + " << number2 << " = " << number1 + number2 << "\n";
            std::cout << std::endl;
        }
    }
}

Ввод:

 add    
 1     
 e   

Ввод:

1 + 0 = 0    

<add>, <subtract>, <divide>, <multiply>, or <exit> Number 1: Number 2: (this part just repeats forever)

Я надеюсь, что есть способ сделать вторую итерацию по циклу идентичнойсначала и не начинайте вводить разрывы строк.

1 Ответ

0 голосов
/ 02 февраля 2019

Когда ввод, заданный для std::cin, не может быть преобразован в тип переменной, которую он запишет, он входит в состояние ошибки, к которому можно обратиться с помощью cin.fail() (или синонимов, таких как !cin).Если он возвращает true (что означает, что failbit потока установлено), то это означает, что преобразование не удалось.Находясь в этом состоянии сбоя, cin откажется читать любые данные до тех пор, пока не будет очищен * 1006. *

В строках, где вы читаете числа от пользователя, вы должны использовать цикл, который проверяет состояние сбояпоток, если он возвращает false, затем продолжит нормальное выполнение, в противном случае вызовите std::cin.clear(), чтобы очистить failbit, чтобы cin мог продолжить чтение как обычно.

Имейте в виду, что ошибочный вводвсе еще будет в потоке (т. е. введенное вами «е» все равно будет там, поэтому, если этот ввод снова будет считан как int, он снова не будет выполнен), поэтому вызовите std::cin.ignore(<A big number like 256>,'\n'), чтобы пропустить неверный / ошибочный ввод,при запросе у пользователя правильного ввода (количество пропущенных символов - это количество символов, которое он должен пропустить).Аргумент '\ n' означает, что все символы в потоке игнорируются до следующей строки, без этого пользователю пришлось бы вводить 256 символов.

...