4-2 对atof函数进行扩充,使它可以处理123.45e-6的科学表示法。其中,浮点数后面可能会紧跟一个e或者E以及一个指数(可能有正负号)
#include <ctype.h> #include <stdio.h> #define MAXLINE 100 int getline(char line[], int max); double atof(char s[]) { int i; double val; double power; int sign;//用于标记+ - 号 int flag=-1;//标记指数的正负 int zhsh;//指数 double powerzh; for(i=0;isspace(s[i]);i++) ; if(s[i]=='-') { sign=-1; i++; } else if(s[i]=='+') { sign=1; i++; } else { sign=1; } for(val=0.0;isdigit(s[i]);i++) { val= val*10 + ( s[i]-'0'); } if(s[i]=='.') i++; for(power=1.0;isdigit(s[i]);i++) { val = val*10 + (s[i]-'0'); power = power*10; } val= sign*val/power; if(s[i]=='e'||s[i]=='E') i++; if(isdigit(s[i])) flag=1; else if (s[i]=='+') { flag=1; i++; } else if (s[i]=='-') { flag=-1; i++; } zhsh=s[i]-'0';☆☆☆ powerzh=1.0; for(int count =0; count<zhsh;count++) powerzh = 10* powerzh; if(flag==1) val = val*powerzh; else if(flag==-1) val = 1.0*val/powerzh; return val; } /* getline: get line into s, return length */ int getline(char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != '\n') s[i++] = c; s[i] = '\0'; return i; } int main() { double sum, atof(char []); char line[MAXLINE]; int getline(char line[], int max); sum = 0; while (getline(line, MAXLINE) > 0) printf("\t%g\n", sum += atof(line)); return 0; }