检查用户是否向int var输入了一个浮点数?

时间:2010-08-04 07:58:47

标签: c++

我有一个int var;并使用cin,但如何检查用户是否输入了浮点数或为我提供了解决此问题的方法?

4 个答案:

答案 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)

将变量读入临时字符串,解析它以查看是否包含.,Ee或其他非整数字符,然后转换如果它有效,则为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; 
} 

根据您想要达到的目标,可能有更好的解决方案。