如何在尝试将Car *转换为C++中的双时检查双溢出

如何在尝试将Car *转换为C++中的双时检查双溢出,c++,string,casting,double,C++,String,Casting,Double,我想将C++中的字符转换为双。但在此之前,我想检查char*是否是正确的双精度数字。因此,我制定了以下代码: bool Tools::m_CheckIfDouble(char *p_nb) { if (p_nb == NULL) return (false); for (unsigned int v_i = 0; p_nb[v_i]; v_i++) if ((p_nb[v_i] < '0' || p_nb

我想将C++中的字符转换为双。但在此之前,我想检查char*是否是正确的双精度数字。因此,我制定了以下代码:

bool                    Tools::m_CheckIfDouble(char *p_nb)
{
    if (p_nb == NULL)
        return (false);
    for (unsigned int v_i = 0; p_nb[v_i]; v_i++)
        if ((p_nb[v_i] < '0' || p_nb[v_i] > '9') && (p_nb[v_i] != '.' && p_nb[v_i] != '-'))
            return (false);
    return (true);
}

但是,如果char*的值大于DBL_MAX或小于DBL_MIX,我不知道如何检查char*是否存在双重溢出。

标准库函数strod应该执行以下操作:

#include <cstdlib>
#include <cerrno>

double convert(char const * str)
{
    char * e;
    double res = std::strtod(str, &e);

    if (e == str || *e != 0) { /* error (invalid string) */ }

    if ((res == HUGE_VAL || -res == HUGE_VAL) && errno == ERANGE) { /* overflow */ }

    if (res == 0 && errno == ERANGE) { /* underflow */ }

    return res;
}

你明白了;您可以根据自己的要求自定义错误处理。

请参阅:除非您有很好的理由不使用boost::lexical\u cast,否则我建议您使用它。此函数是否可以管理诸如双重溢出或int溢出之类的错误?@AJG85:这不仅无法实现合理的错误检查,而且strod是C89和C++98的一部分,所以这两种标准都是如此。啊,是的,的确如此。它看起来就像@aelnajjar指出的新的C++11函数之一。