《C程序设计语言》练习4-2
对atof函数进行扩充,使它可以处理形如
123.45e-6
的科学表示法,其中,浮点数后面可能会紧跟一个e或E以及一个指数(可能有正负号)。
12345678910111213141516171819202122232425262728 | double atof(char s[]){ double val,power; int i,sign; for (i=0; isspace(s[i]); i++) { ; } sign = (s[i] == '-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') { i++; } for (val = 0.0; isdigit(s[i]); i++) { val = 10.0* val + (s[i] - '0'); } if (s[i] == '.') { i++; } for (power = 1.0; isdigit(s[i]); i++) { val = 10.0 * val + (s[i] - '0'); power *= 10.0; } return sign * val / power;} |
思路
- 提供的atof函数已经可以处理e之前的部分,需增加对e后部分的处理。
- 跳过e符号,获得符号位Esign,最后得到指数j。
代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | #include <stdio.h>#include <ctype.h>#include <math.h>double atof(char s[]);int main() { char s[] = "3.1415E10"; double ret = atof(s); return 0;}double atof(char s[]){ double val,power; int i,sign; int Esign = 0,j = 0; for (i=0; isspace(s[i]); i++) { ; } sign = (s[i] == '-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') { i++; } for (val = 0.0; isdigit(s[i]); i++) { val = 10.0* val + (s[i] - '0'); } if (s[i] == '.') { i++; } for (power = 1.0; isdigit(s[i]); i++) { val = 10.0 * val + (s[i] - '0'); power *= 10.0; } if (s[i] == 'e' || s[i] == 'E') { i++; Esign = (s[i] == '-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') { i++; } for (j=0; isdigit(s[i]); i++) { j = 10 * j + (s[i] - '0'); } } return sign * val / power * pow(10, Esign*j);} |