严格的字符串到int [long]

时间:2010-06-17 21:16:41

标签: c++

我们是否有一种以严格的方式将char *转换为int(或long)的标准方法,即只有当所有字符都是数字并且可以适合int(或long)时,我们才能获得正确的结果 - 一些通过使用strtol等方式..?

因此,使用该功能,“sbc45”,“4590k”,“56”,“56”应全部无效。

3 个答案:

答案 0 :(得分:3)

这是一个接近@GMan所做的版本,但它不接受prepeding空格。例如" 101"

#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <exception>

long strict_conversion(const std::string& number_string)
{
    long number;
    std::stringstream convertor;
    convertor << std::noskipws << number_string;
    convertor >> number;
    if( convertor.fail() || !convertor.eof() )
        throw std::runtime_error("The string didn't pass the strict conversion!");
    return number;
}

一分钟后,这是通用的:

template <typename NumberType>
NumberType strict_conversion(const std::string& number_string)
{
    NumberType number;
    std::stringstream convertor;
    convertor << std::noskipws << number_string;
    convertor >> number;
    if( convertor.fail() || !convertor.eof() )
        throw std::runtime_error("The string didn't pass the strict conversion!");
    return number;
}

答案 1 :(得分:2)

您可以使用strtol - 它返回指向输入中第一个“错误字符”的指针,因此您只需检查'\0'以查看是否有任何垃圾。如果值超出范围,则errno设置为ERANGE,因此您也可以检测到该值。

唯一需要注意的是strtol会悄悄丢弃任何领先的空白。您可以通过将isspace应用于输入的第一个字符来自行检查。

答案 2 :(得分:0)

我想我会用这样的东西:

long convert(std::string const &s) { 
    if (s.find_first_not_of("0123456789") != std::string::npos)
        throw std::invalid_argument("Cannot convert value");
    return strtol(s.c_str(), NULL, 10);
}