我有一个int var;并使用cin,但如何检查用户是否输入了浮点数或为我提供了解决此问题的方法?
答案 0 :(得分:2)
没有简单的方法可以做到这一点。通过>> operator
输入的内容实际上不是为了与可能输入错误内容的人进行交互。您必须将输入作为字符串读取,然后使用类似strtol的函数或您自己的手动代码进行检查。
以下是使用strtol的方法概述:
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
bool GetInt( istream & is, int & n ) {
string line;
if ( ! getline( is, line ) ) {
return false;
}
char * ep;
n = strtol( line.c_str(), & ep, 10 );
return * ep == 0;
}
int main() {
int n;
while(1) {
cout << "enter an int: ";
if ( GetInt( cin, n ) ) {
cout << "integer" << endl;
}
else {
cout << "not an integer" << endl;
}
}
}
答案 1 :(得分:1)
将变量读入临时字符串,解析它以查看是否包含.
,,
,E
,e
或其他非整数字符,然后转换如果它有效,则为int。
或者只是将值读入float并将其转换为int(根据需要使用舍入或截断)。
答案 2 :(得分:1)
可能最简单的方法是接受float / double,将其强制转换为int,然后测试转换是否修改了该值。
int i ;
float f ;
std::cout << "Input: " ;
std::cin >> f ;
i = static_cast<int>(f) ;
if( static_cast<float>(i) != f )
{
std::cout << "Not an integer" ;
}
else
{
std::cout << "An integer" ;
}
请注意,对于无法精确表示为浮点的大整数(大多数值大于6位),这将失败,但工作范围可能非常适合您的需求。
答案 3 :(得分:0)
您可以使用临时字符串和boost::lexical_cast
将其转换为整数或浮点变量,如下所示:
#include <iostream>
#include <boost/lexical_cast.hpp>
int main()
{
using namespace std;
string buf;
cin >> buf;
bool int_ok = false, float_ok = false;
try {
int x = boost::lexical_cast<int>( buf );
int_ok = true;
} catch ( boost::bad_lexical_cast e ) { int_ok = false; }
if ( !int_ok ) {
try {
float x = boost::lexical_cast<float>( buf );
float_ok = true;
} catch ( boost::bad_lexical_cast e ) { float_ok = false; }
}
return 0;
}
根据您想要达到的目标,可能有更好的解决方案。