0

我有以下简单的代码:

#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;
}

当我运行上面的代码并输入: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;
}

该代码块也无法测试是否为整数,因为当我使用浮点输入运行它时,a它只是跳过了该块。if

那么为什么在使用 cin 获取用户输入时会出现这种情况呢?如果有时我希望输入为189,但18.9意外键入,会导致18这种情况,这很糟糕。那么这是否意味着使用cin获取用户输入整数不是一个好主意?

谢谢你。

4

3 回答 3

6

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

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

于 2013-03-24T04:01:53.747 回答
1

在阅读用户输入时,我不喜欢使用operator>>用户输入,因为用户输入通常是基于行的并且容易出错。我发现最好一次阅读一行并验证:

 std::string   line;
 std::getline(std::cin, line);

这也使得检查不同类型的数字变得容易。

 std::stirngstream linestream(line);
 int  val;
 char c;

 if ((linestream >> val) && !(linestream >> c))
 {
     // Get in here if an integer was read.
     // And there is no following (non white space) characters.
     // i.e. If the user only types in an integer.
     // 
     // If the user typed any other character after the integer (like .5)
     // then this will fail.
}

当然 boost 已经支持这一点:

val = boost::lexical_cast<int>(linestream); // Will throw if linestream does 
                                            // not contain an integer or
                                            // contains anything in addition
                                            // to the integer.

Boost 当然也会转换浮点数。

于 2013-03-24T06:09:23.083 回答
1

我有一些代码片段很糟糕,但它可以工作。这个方法很简单,但不处理输入值无效的情况。查看更多:https ://en.cppreference.com/w/cpp/string/byte/atof

static float InputFloat(std::string label)
{
    std::string input;
    std::cout << label;
    std::cin >> input;
    return atof(input.c_str());
}

int main()
{
    float value = InputFloat("Enter some float value: ");
    std::cout << "value = " << value;
    return 0;
}
于 2020-02-29T05:35:11.617 回答