2015-10-25 3 views
1

Я хотел сделать программу «високосного года» как практику.
Это мой код:Ошибка при проверке типа

#include <iostream> 
#include <string> 

int main(){ 
int year; 
std::string flag01; 
do { 
    std::cout << "Input year: "; 
    std::cin >> year; 
//check for int input 
    while (std::cin.fail()){ 
     std::cout << "Oops..." << std::endl << "I failed to get a year..." << std::endl << "Try again?"; 
     std::cin.clear(); 
     std::cin >> year; 
    } 
    if (year % 4 == 0 && year % 100 != 0 && year != 0) 
     std::cout << "the year " << year << " is a leap year.\n"; 
    else 
     std::cout << "the year " << year << " is not a leap year.\n"; 
    std::cout << "Would you like to input another? yes/no \n"; 
    do { 
     std::cin >> flag01; 
      if (flag01 != "yes" && flag01 != "no") 
       std::cout << "please only insert yes or no\n"; 
    } while (flag01 != "no" && flag01 != "yes"); 
} while (flag01 != "no"); 
return 0; 
} 

Но я не могу сделать ту часть, где он проверяет, является ли то, что вы вводите это int или нет, работа. Я не знаю, что я делаю неправильно.
Когда я запускаю его и ввести char или string он идет в бесконечный цикл и продолжает печатать линию 11.

Я видел std::cin.fail и std::cin.clear здесь: Checking input value is an integer

Пожалуйста, помогите и спасибо.

ответ

0

Вы очищаете состояние ошибки, но данные, вызвавшие ошибку, все еще находятся в потоке. Очистите его с помощью игнорирования ...

std::cout << "Oops..." << std::endl << "I failed to get a year..." << std::endl << "Try again?"; 
    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //extract all characters until /n 
    std::cin >> year; 

Включить ограничения заголовка для std :: numeric_limits.

#include <limits> 
+0

Теперь это работает так спасибо! Еще один вопрос; 'numeric_limits' и' streamsize' находятся в 'std', но' max() 'тоже то же самое ?. Если ответ слишком велик, где я могу его прочитать? – axxooss

+0

'max()' является функцией-членом 'std :: numeric_limits', которая возвращает максимальное значение для данного типа шаблона' std :: streamsize'. Используя максимальный поток, гарантируется, что весь поток очищается. – Unimportant

+0

Я получаю это сейчас. Еще раз спасибо! – axxooss

Смежные вопросы