Member 13689754 Ответов: 3

Проблема с циклом проверки ввода


Я успешно добился того, чтобы моя проверка работала, но когда они вводят любой символ, который не является целым числом, он печатает приглашение ввода дважды. Как сделать так, чтобы это печаталось только один раз? Я уверен, что это очень простое решение, но я использую c++ всего несколько недель.

// Unit 5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;


int main()
{

	int lowNum;
	cout << "Please enter your low number (only use numbers 1 - 256): ";
	cin >> lowNum;

	while (lowNum < 1 || lowNum > 256)
	{
		cout << "Please only enter numbers between 1 and 256: ";
		cin >> lowNum;
		if (cin.fail())
			cin.clear();
			cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
	}

    return 0;
}


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

Я перепробовал все, что знаю, но мне не хватает знаний, чтобы решить эту проблему.

3 Ответов

Рейтинг:
2

CPallini

Это работает на моей коробке Linux:

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;


int main()
{
  int lowNum = 0;
  while ( lowNum < 1 || lowNum > 256)
  {
    cout << "Please enter your low number (only use numbers 1 - 256): ";
    cin >> lowNum;
    if ( cin.fail() )
    {
      cin.clear();
      cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  }

  cout << "lowNum " << lowNum << endl;
}


Рейтинг:
1

phil.o

Вы можете использовать функция scanf() [^] что позволяет вам указать, что вы ожидаете в качестве входных данных:

#include <iostream>
#include <cstdio>
unsing namespace std;

int main() {
   int lowNum, returnValue;
   do {
      cout << "Please enter your low number (only use numbers 1 - 256): ";
      returnValue = scanf("%3d", &lowNum);
   } while (returnValue != 1 || lowNum < 1 || lowNum > 256);
   // ...
   return 0;
}

Или вы можете сделать это сохраняя cin если вам нужно/хочется:
#include <iostream>
#include <limits>
using namespace std;

int main() {
   int lowNum;
   cout << "Please enter your low number (only use numbers 1 - 256): ";
   while (!(cin >> lowNum) || lowNum < 1 || lowNum > 256) {
      cin.clear();
      cin.ignore(numeric_limits<streamsize>::max(), '\n');
      cout << "Please only enter numbers between 1 and 256: ";
   }
   // ...
   return 0;
}

Надеюсь, это поможет. Любезно.


Рейтинг:
1

Patrice T

Цитата:
Я перепробовал все, что знаю, но мне не хватает знаний, чтобы решить эту проблему.

Когда вы не понимаете, почему ваша программа делает что-то или нет, самое время обратиться к отладчику и посмотреть самостоятельно, что происходит.

Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Visual Basic / Visual Studio Video Tutorial - Базовая Отладка - YouTube[^]
Visual Basic .NET programming for Beginners - точки останова и средства отладки[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.