【发布时间】:2015-12-05 16:43:26
【问题描述】:
我知道以前有人问过这个问题,但答案并没有解决我的问题,所以我问这个问题
我有一个简单的程序来找到三个数字中最大的一个,它应该只接受浮点数。如果输入字符或字符串,则需要显示错误,用户需要再次输入。
我有一个函数来获取一个有效的浮动输入
float validInput()
{
float x;
cout<< flush;
cin >> x;
while(cin.fail())
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(),'\n');
cout << "Not a numeric value please enter again\n";
cin >> x;
}
return x;
}
所以我在 main 函数中使用 validInput 之类的输入
int main()
{
float x = validInput();
float y = validInput();
float z = validInput();
findGreatest(x,y,z);
return 0;
}
此方法适用于大多数输入。当我输入一个数字后跟一个字符时它会失败,validInput 函数会奇怪地失败。在给出这样的输入时,它会显示错误消息 “不是数值,请再次输入”,但不接受另一个输入,而是将字符之前的数值视为输入并存储它。我的要求是忽略整个输入并要求新的输入
据我了解
cin.ignore(numeric_limits<streamsize>::max(),'\n');
不会忽略在输入开头输入的数字,而只会从流中清除字符,即使 cin.fail() 为真。
有没有办法解决这个问题? cin.ignore 可能需要不同的参数,但不确定。
提前致谢
来源: https://stackoverflow.com/a/16934374/5236575
PS:我不能使用任何特殊的库,比如 boost。该代码用于实现软件测试的测试用例,因此它需要正确处理任何类型的输入。
【问题讨论】: