如何制作cin >>不将float转换为整数?

tao*_*ocp 0 c++ integer cin

我有以下简单的代码:

#include <iostream>
int main()
{
   int a;
   std::cout << "enter integer a" << std::endl;
   std::cin >> a ;

   if (std::cin.fail())
   {
      std::cin.clear();
      std::cout << "input is not integer, re-enter please" <<std::endl;
      std::cin >>a;
      std::cout << "a inside if is: " << a <<std::endl;
   }
   std::cout << "a is " << a <<std::endl;
   std::cin.get();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码并输入:时1.5,它输出:a is 1.仅供参考:我使用gcc 4.5.3编译并运行代码.

这意味着如果cin期望一个整数但看到一个浮点数,它将隐式地进行转换.那么这是否意味着当cin看到一个浮点数时,它不处于fail()状态?为什么会这样?是因为C++对>>运算符进行隐式转换吗?

我还尝试了以下代码来判断给定的输入数是否是整数,从这篇文章的想法:测试给定的数字是否为整数:

#include <iostream>
bool integer(float k)
{
    if( k == (int) k) return true;
    return false;
}

int main()
{
   int a;
   std::cout << "enter integer a"<< std::endl;
   std::cin >> a ;

   if (!integer(a))
   {
     std::cout << "input is not integer, re-enter please" ;
     std::cin.clear();
     std::cin >> a;
     std::cout << "a inside if is: " << a <<std::endl;
   }
   std::cout << "a is " << a <<std::endl;
   std::cin.get();
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码也无法测试是否a为整数,因为if当我使用float输入运行它时它只是跳过块.

那么为什么在使用cin获取用户输入时就是这种情况?如果有时候我想要输入189,但是18.9偶然输入,那么18在这种情况下会导致这种情况很糟糕.那么这是否意味着使用cin获取用户输入整数不是一个好主意?

谢谢.

Vau*_*ato 6

当你读取一个整数并给它一个1.5的输入时,它看到的是整数1,并且它在那段时间停止,因为它不是整数的一部分.".5"仍然在输入中.这就是你只得到整数部分的原因,这也是它似乎没有第二次等待输入的原因.

为了解决这个问题,您可以读取浮点数而不是整数,以便读取整个值,或者您可以在读取整数后检查线上是否还有其他内容.