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を忘れないように。