проверка — проверка того, что несколько входов являются числами (c ++)

Я делал программу, в которой я спросил пользователя о дате и сравнил ее с текущей датой. Все функции были там, но я не мог проверить, чтобы день, месяц и год были числами, поэтому ввод букв приводил к сбою программы. Есть идеи? (Примечание: функции в цикле 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));

1

Решение

Это зависит от определения ваших переменных. Давайте предположим:

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;
}

Онлайн демо

0

Другие решения

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

isdigit(char c)

Проверяет, является ли символ c десятичной цифрой.

Возвращаемое значение:
Значение, отличное от нуля (т. Е. Истина), если действительно c является десятичной цифрой. Ноль (т. Е. Ложь) в противном случае.

0

По вопросам рекламы [email protected]