我是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
答案 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
要检查输入是否为数字,请
#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
。然后,必须通过检查流的45
和fail
位来检查转换是否完全成功。