cin.clear()
не очищает стандартный ввод. Он очищает биты ошибок, такие как eofbit
, failbit
и другие, и устанавливает поток в исправное состояние. Может быть, вы ожидали, что это что-то прояснит? Если пользователь набрал
yes no
Как раз перед тобой, а ты
cin >> someStringVariable;
Он будет читать до no
, а поток все равно будет содержать
no
Вызов clear
затем очищает все активные биты ошибок. Тогда ваш
cin>>addAntonymAnswer1;
Будет читать no
, который не был съеден предыдущим чтением, и действие немедленно возвращается, не ожидая нового ввода. Что вы должны сделать, это сделать clear
с последующим игнорированием, до следующей новой строки. Вы говорите ему количество символов, которое он должен максимально игнорировать. Эта сумма должна быть максимально возможным числом:
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Это приведет к тому, что поток станет пустым, и последующее чтение будет ждать, пока вы что-то наберете.
Другая проблема возникает, если у вас есть cin >>
, за которым следует getline
: cin оставит все пробелы (также новые строки) после своего токена чтения, но getline
прекратит чтение после того, как достигнет такой новой строки. Я вижу, вы поставили clear
после почти всего. Поэтому я хочу показать вам, когда вам это нужно, а когда нет. Вам это не нужно, когда вы упорядочиваете несколько cin >>
. Предположим, у вас есть в буфере: "foo \ nbar \ n". Затем вы делаете следующее чтение
cin >> a; // 1
cin >> b; // 2
После первого, ваш буфер будет содержать "\ nbar \ n". То есть символ новой строки все еще активен. Второй cin>>
сначала пропустит все пробелы и символы новой строки, чтобы он мог справиться с тем, что \n
находится перед bar
. Теперь вы также можете упорядочить несколько вызовов getline
:
getline(cin, a);
getline(cin, b);
Getline выбросит \n
, которое он читает в конце строки, но не будет игнорировать символы новой строки или пробелы в начале. Итак, после первой getline буфер содержит «bar \ n». Второй getline также будет правильно читать "bar \ n". Теперь давайте рассмотрим случай, когда вам нужно очистить / игнорировать:
cin >> a;
getline(cin, b);
Первый покинет поток как "\ nbar \ n". Затем getline сразу увидит \n
в начале и будет считать, что она читает пустую строку. Таким образом, он будет немедленно продолжен и ничего не будет ждать, оставляя поток как "bar \ n". Итак, если у вас есть getline
после cin>>
, вы должны сначала выполнить последовательность очистки / игнорирования, чтобы очистить символ новой строки. Но между getline
или cin>>
вы не должны этого делать.