用户输入日期,目前已经过验证,以确保该值介于1和1之间。 31包容性。
但是,如果他们输入非整数值,它只会在无限循环中不断重复错误消息。
我已经四处寻找答案,但是其他所有提出要求的人似乎都比我更加高级,因此我甚至不了解他们的初始代码。
这是代码
void Menu::setDate()
{
date = 0;
std::cout << "Please enter todays date: (as an integer) ";
do
{
std::cin >> date;
if (date > 0 && date < 32)
{
break;
}
std::cout << "Error: Please enter todays date: (as an integer) ";
}
while (true);
}
答案 0 :(得分:4)
问题是当输入非数字时,流会出现错误状态。您应该清除它并跳过无效输入。例如
cin.clear();
cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );
答案 1 :(得分:3)
您的代码存在的问题是输入无效整数时,流会收到错误并设置为failbit。因此,您需要先清除它,然后才能再次使用I / O操作。试试这个:
void Menu::setDate()
{
date = 0;
std::cout << "Please enter todays date: (as an integer) ";
while(true){
std::cin >> date;
if(date > 0 && date < 32){
break;
}
else{
std::cout << "Error, please enter today's date (as an integer):" << std::endl;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}
}
答案 2 :(得分:0)
首先检查cin.fail()
。
这就是你获得无限循环的方式:当std::cin >> date
失败时,date
可能会保持不变。所以你有效地做到了这一点:
do
{
if (date > 0 && date < 32)
{
break;
}
std::cout << "Error: Please enter todays date: (as an integer) ";
}
while (true);
答案 3 :(得分:0)
看起来当std::cin>>a
遇到小数点时,它会停止进一步输入。剩下的数字保留在输入缓冲区中。
int a,b,c;
std::cin>>a;
std::cin>>b;
std::cin>>c;
如果用户输入 1.9 ,则在第一步中 1 , .9 保留在输入缓冲区。下一个std::cin
语句跳过输入,因为输入缓冲区中的第一个字符是小数点。在进行浮动输入时,缓冲区被清除。