Я делал программу, в которой я спросил пользователя о дате и сравнил ее с текущей датой. Все функции были там, но я не мог проверить, чтобы день, месяц и год были числами, поэтому ввод букв приводил к сбою программы. Есть идеи? (Примечание: функции в цикле do while работают как задумано)
do // This do while loop forces the user to enter a valid date before moving on
{
cout << "Enter the lent date in the format dd/mm/yyyy: " << endl;
cin >> day1 >> buffer >> month1 >> buffer >> year1;
if(cin.fail())
{
continue;
}
}
while (!validateDateSize(day1, month1, year1) || !validateDateIntegrity(day1, month1, year1));
Это зависит от определения ваших переменных. Давайте предположим:
int day1, month1, year1;
char buffer;
Ввод действительной даты, такой как «12/3/2017», «12-3-2017» или даже «12.3.2017», пройдет тест. Ввод недопустимых дат, но с допустимым форматом, таким как «125.3.2017», провалит тест и зациклится, чтобы предложить следующий шанс для правильного ввода.
Так в чем проблема ?
Но если что-то пойдет не так в формате, например, с «12 / A / 2017», cin
потерпит неудачу при первом неожиданном символе (здесь ‘A’). Ваш код будет тогда continue
петля. К сожалению, статус ошибки cin
останется неизменным, что приведет к сбою любого последующего ввода, и ваш код будет зацикливаться вечно.
Как это исправить?
Вам нужно clear()
состояние ошибки, а также ignore()
неправильные символы, которые вызвали ошибку и все еще находятся на входе:
if(cin.fail())
{
cin.clear(); //reset error flags
cin.ignore(numeric_limits<streamsize>::max(),'\n'); // and ignore characters until the next newline
continue;
}
Перед выполнением любой проверки проверьте, является ли ввод, полученный от пользователя, цифрой или нет.
isdigit(char c)
Проверяет, является ли символ c десятичной цифрой.
Возвращаемое значение:
Значение, отличное от нуля (т. Е. Истина), если действительно c является десятичной цифрой. Ноль (т. Е. Ложь) в противном случае.