如何检查用户输入的输入是否包含小数?

时间:2016-06-27 07:40:24

标签: c++ c++11

我是C ++的新手。我有一种情况,输入整数取自用户。但是,我需要检查用户是否输入了小数值。我该如何检查?

我尝试了cin.good()cin.fail(),但他们只检测非数字条目而不是十进制数字。任何帮助将不胜感激。

#include <iostream>

int main()
{
  using namespace std;
  int x;
  cout << "Enter an integer: " << endl;
  cin >> x;

  if (cin.good()) {
    cout << "input is an integer" << endl;
  }
  else 
    cout << "input is not an integer" << endl;
}

这是我的输出:

1

Enter an integer: 
1.2
input is an integer

2

Enter an integer: 
a
input is not an integer

3 个答案:

答案 0 :(得分:1)

float x = 4.2;
if (x == (int) x)
{
    // int
}
else
{
    // not int
}

答案 1 :(得分:1)

您可以使用std::isdigit检查下一行的字符串输入。

  bool is_numeric(const std::string& str)
  {
     std::string::const_iterator it = str.begin();
     if (it != str.end() && *it == '-') ++it;
     if (it == str.end()) return false;
     while (it != str.end() && std::isdigit(*it)) ++it;
     return it == str.end();
  }

如果需要,改变它以使用浮点并不难,但该功能将精确检查您需要的内容。

答案 2 :(得分:0)

您从int收到cin输入,因此输入的任何浮动信息在您开始使用时都会被截断。您应该以{{1​​}}或float的形式收到,以确定输入的有效性。

删除了之前的答案,因为它在手动解析输入的滑路上走了下去,这是不必要且容易出错的。标准库已经有多种方法来检查输入是否是有效数字。我知道两种方式:C ++流和C库函数string。以下是使用后者的示例:

strtof

Live example

要检查输入是否为数字,请

#include <iostream>
#include <string>
#include <cmath>

bool is_int(float f) {
    return std::floor(f) == f;
}    

int main()
{
    std::cout << "Enter an integer: ";
    std::string input;
    std::cin >> input;
    char *e = nullptr;
    char const *str = input.c_str();
    float const f = strtof(str, &e);
    // no conversion was performed or was stopped as disallowed
    // characters were encountered: Not A Number
    if ((e == str) || (*e != '\0'))
        std::cout << "NAN";
    else if ((f == HUGE_VALF) || !std::isfinite(f))
        std::cout << "too large";
    else
        std::cout << (is_int(f) ? "integer" : "non-integer");
    std::cout << '\n';
}

也是可能的,但它也会接受NAN作为有效输入,例如float f; cin >> f; 将转换为45dsf。然后,必须通过检查流的45fail位来检查转换是否完全成功。

另见