I have the following simple code:
#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;
}
When I run the above code and input: 1.5
, it outputs: a is 1
. FYI: I compile and run the code with gcc 4.5.3.
This means that if cin
expects an integer but sees a float, it will do the conversion implicitly. So does this mean that when cin
sees a float number, it is not in fail()
state? Why this is the case? Is it because C++ does implicit conversion on >>
operator?
I also tried the following code to decide whether a given input number is integer following idea from this post: testing if given number is integer:
#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;
}
This block of code was also not able to test whether a
is integer since it simply skip the if
block when I run it with float input.
So why this is the case when getting user input with cin? What if sometimes I want the input to be 189
, but typed 18.9
by accident, it will result in 18
in this case, which is bad. So does this mean using cin
to get user input integers is not a good idea?
thank you.
See Question&Answers more detail:os