-1

C ++でchar *をdoubleに変換したい。しかし、それを行う前に、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 * の二重オーバーフローをチェックする方法がわかりません (char * の値が DBL_MAX の値より大きいか、DBL_MIX より小さい場合)。

4

1 に答える 1

2

標準ライブラリ関数strtodはトリックを行う必要があります。

#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;
}

アイデアはわかります。エラー処理を独自の要件に合わせてカスタマイズできます。

于 2012-11-06T04:12:11.533 に答える