K&Rを読もう(40) 演習 4-2 指数表現付きatof

math.hで小一時間ハマってしまった。

演習 4-2

atofを拡張して,123.45e-6のような指数表現を扱えるようにする問題。

#include <math.h>

double atof_copy(char s[])
{
    double value = 0, power = 1;
    int i,sign, e_sign, e = 0;

    for (i = 0; isspace(s[i]); i++)
        ;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '+' || s[i] == '-')
        i++;
    for (; isdigit(s[i]); i++)
        value = value * 10 + s[i] - '0';
    if (s[i] == '.')
        i++;
    for (; isdigit(s[i]); i++) {
        value = value * 10 + s[i] - '0';
        power *= 10.0;
    }
    if (s[i] == 'e' || s[i] == 'E') {
        i++;
        e_sign = (s[i] == '-') ? -1 : 1;
        if (s[i] == '+' || s[i] == '-')
            i++;
        for (; isdigit(s[i]); i++)
            e = e * 10 + s[i] - '0';
        e *= e_sign;
    }

    return sign * value * pow(10, e) / power;
}

atofと同じような手順で拡張した。

逐次で処理すると123-45なんてときにも処理してしまうので、eがあるときのみ処理を進める。123e45は+として許容している。

gcc -lmを忘れないように。