cin.fail检查重复多个cin'd字符的cout错误信息。

问题描述 投票:0回答:2

我的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可以解决这个问题,但它仍然重复了四次。

c++ cin ignore
2个回答
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(应该是这样)。

参考文献。http:/en.cppreference.comwcppstringbasic_stringstol


0
投票

不管你喜不喜欢,你都注定要经历一次考验。在这种情况下,像

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""

© www.soinside.com 2019 - 2024. All rights reserved.