John Last Ответов: 1

Помощь в использовании iostream с циклами while


У меня возникла проблема: всякий раз, когда я запрашиваю у пользователя целочисленный конкретный ввод, если пользователь введет что-то, что не является целым числом, мой код предложит пользователю ввести ввод 3 раза, прежде чем разрешить пользователю ввести ввод.
Вот мой очень простой код:
int main()
{
	bool valid = false;
	bool bfail;
	int mStreetNum;
	while (!valid)
	{
		cout << "Enter street number: ";
		cin >> mStreetNum;
		bfail = cin.fail();
		if (bfail)
		{
			cin.clear();
			cin.ignore();
			continue;
		}

		valid = true;
	}

}


Вот такие результаты:
Enter street number: gef
Enter street number: Enter street number: Enter street number: edf
Enter street number: Enter street number: Enter street number: 12

Как мне снова предложить пользователю ввести данные, не запрашивая их несколько раз, прежде чем он сможет войти? Я протестировал это на visual studio c++, на Windows 10 cmd с установленным компилятором GNU g++ и на машине Linux.

Что я уже пробовал:

Я попытался использовать свой отладчик, чтобы попытаться выяснить, что происходит, но он по какой-то причине, кажется, пропускает cin после того, как я намеренно ввожу нецелочисленный ввод. Мой код достаточно прост, и я искренне недоумеваю, почему это происходит.

1 Ответов

Рейтинг:
8

CPallini

Попробуй:

#include <iostream>
#include <limits>
using namespace std;

int main()
{
  bool valid = false;
  bool bfail;
  int mStreetNum;
  while (!valid)
  {
    cout << "Enter street number: ";
    cin >> mStreetNum;
    bfail = cin.fail();
    if (bfail)
    {
      cin.clear();
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
      continue;
    }
    valid = true;
  }
}


John Last

Спасибо, но почему это работает? Что мой предыдущий код не делал того, что делал ваш?

CPallini

По умолчанию cin. ignore() игнорирует только один символ (или останавливается в конце файла).