(C ++)如何检查输入字符串是否为整数?

时间:2015-11-22 16:12:21

标签: c++

我希望此代码检查输入是否为int,并且在我输入float类型号之前它可以正常工作。我需要一个不会通过浮点数的程序。

bool error;
int x;
string s;
do
{
    cout <<"number: ";
    cin >> x;
    error=cin.fail();
    if(error)
    {
        cout << "error" <<endl;
        cin.clear();
    }
    getline(cin,s);
}while(error);
cout << x;

3 个答案:

答案 0 :(得分:0)

std::istream& operator(std::istream&, int)将读取一个有效的整数,直到任何不匹配的字符,如'.',并且到目前为止,流不会设置错误状态。

您最好将std::string完整(空白空间)块读取,并检查它们是否包含所需格式(例如使用std::regex)。

如果您尝试转换块,

std::stoi()也应该失败并发生异常。

答案 1 :(得分:0)

我认为,你正在寻找类似这样的东西(C ++ 11):

auto s = std::string{};

std::cin >> s;

if( std::all_of(std::begin(s), std::end(s),
                [](char c) -> bool {
                    return c <= '0' && c <= '9';
                }) ) {
    std::cout << "you have entered an integer" << std::endl;
}

不知怎的,我想,标准库包含一个谓词,用于检查给定的char是否为数字,但我现在找不到它。这种假设is_digit()将使代码更具可读性:

if( std::all_of(std::begin(s), std::end(s), std::hypothetic::is_digit) ) {
    std::cout << "you have entered an integer" << std::endl;
}

答案 2 :(得分:0)

以字符串then convert the string to an integer with std::stoi读取所有用户的输入行。

不幸的是,当std :: stoi到达可转换字符的末尾时,它会愉快地停止转换,但是它允许您传入指向要使用结束转换的字符更新的位置的指针。如果这个位置不是字符串的结尾,那么就行了垃圾。

bool error = true; // assume user input is wrong
while (error)
{    
    if (std::getline(std::cin, s)) // grab the whole line 
    {
        std::size_t end;
        try
        {
            x = std::stoi(s, &end);
            if (end == s.length()) // converted all user input
            {
                error == false; // good data
            }
        }
        catch(std::invalid_argument &) // user input is complete garbage
        {
        }
        catch(std::std::out_of_range &) // converted user input is too big for int.
        {
        }
    }
}
                                  ^ 

我建议将输入循环转换为函数。 1)如果您需要再次转换int,它很容易重复使用。 2)它摆脱了上面的一些逻辑,因为你可以return在输入被测试时很好。

int gimmieInt(std::istream& in) // Me eat input stream! Om nom nom nom!
{
    std::string s;
    int x;

    while (true) // consider instead using a maximum number of retries. 
                 // This increases complexity, so consider it *after* you have 
                 // the basic version working 
    {    
        if (std::getline(in, s)) 
        {
            std::size_t end;
            try
            {
                x = std::stoi(s, &end);
                if (end == s.length()) 
                {
                    return x; 
                }
            }
            catch(std::invalid_argument &) // user input is complete garbage
            {
            }
            catch(std::std::out_of_range &) // user input is too big for int.
            {
            }
        }
    }
}