我的cin.fail检查出了一点问题。我试着做了一些研究,想找到与我的答案有关的东西,但我真的找不到任何与我的问题相同的东西。下面是一个示例脚本。
cout << "Type in the base stat amount: ";
cin >> baseStat;
while (cin.fail())
{
cin.clear();
cin.ignore();
cout << "Error! Base stat must be a number! Try again: ";
cin >> baseStat;
baseStat = floor(baseStat);
}
为了方便参考 "baseStat "是一个浮点数 我把浮点数下限为整数 因为在这个特殊的情况下 我需要它是一个整数来表示一个公式的意思
我想说的是,如果输入的不是浮点数或整数,那么就是一个错误。目前,我的代码可以正常工作,但是只有当你输入一个字符时,比如 "a "或"#",它才会工作。例如,如果我输入 "asdf",我就会得到这样的结果:"Error!
"错误! 基本数据必须是一个数字! 再试一次。错误!基数必须是一个数字!Base stat must be a number! 再试一次。错误!基本数据必须是一个数字! 再试一次。错误!基本数据必须是一个数字! 再试一次 "
我不太清楚如何解决这个问题,我想也许在while循环之前使用for循环将baseStat重置为0可以解决这个问题,但它仍然重复了四次。
如果你想进行输入验证,我建议你输入一个字符串,然后将其转换为一个 int
,通过检查是否可能。类似这样。
int baseStat = 0;
std::string input;
do
{
std::cout << "Type in the base stat amount: ";
std::cin >> input;
try {
baseStat = std::stoi( input );
}
catch( ... )
{
std::cout << "Invalid value, try again\n";
}
}
while( basestat == 0 );
假设你可以使用C++11(应该是这样)。
不管你喜不喜欢,你都注定要经历一次考验。在这种情况下,像
if (baseStat - floor(baseStat) == 0.0)
看起来是可以的。
但首先要提醒一下:由于浮点数固有的不精确性,如果你需要一个整数或定点值,请使用整数。使用浮点值,你可能会得到一个看起来很好的1.0的整数,直到你做数学运算,然后你发现它实际上是0.99999999999997,当你打印出来时,四舍五入,看起来很漂亮。
如果你处理的是北美的钱,就不要用美元来做,要用 double
. 用美分来做 int
. 省去了你很多麻烦。
对于你现在的问题,试试这个。
试试这个: baseStat
一个适当大的整数(我用的是 long long
这里),然后,从用户那里读取整个输入行。
for ( ; ; ) // keep looking until the user inputs a good value
// feel free to put a limit on how stupid a user is allowed to be.
{
std::string line;
if (std::getline(cin, line)) // read in a while line of user input
{
try
{
// try to convert the user's input to a long long int
std::size_t cnv;
baseStat = std::stoll(line, &cnv);
// if we converted everything the user put in
if (cnv == line.length())
{
break; // got a good one. Stop looking
}
}
catch(std::logic_error &)
{
// didn't convert to a valid integer at all
}
}
}
如果你真的想深入了解,并且有一个很好的、通用的、永久的解决方案,请看sehe的答案。"C++用户输入限制与适当的重试,而不是 "goto""