写起来并不难,但是由于需要考虑的情况较多,容易遗漏判断条件,debug逐渐完善代码。
#include<stdio.h>
#include<string.h>
#define MAXLEN 100
double atof(char num[]) // atof,能识别科学计数法形式的输入,用flag、sci来区分整数部、小数部和指数部,以sign和sigmult为符号。
{
int i,sign,flag=0,sci=0,sigmult=1;
double integer=0,dot=0,mult=1;
for(i=0;i<strlen(num);++i)
{
if (num[i] == 'e'|| num[i] == 'E') // 识别科学技术符号
{
flag = 0;
sci = 1;
continue;
}
else if(flag == 0 && num[i] == '.') // 识别小数点
{
flag = 1;
continue;
}
if (sci == 1 && num[i]=='-') // 识别指数正负
sigmult = -1;
if(num[i]==' ')
continue;
sign = (num[i]=='-')?-1:1; // 识别整数正负
if(num[i]=='-' || num[i]=='+')
continue;
if(flag == 0 && sci != 1 && num[i] != '.' && num[i] != 'E' && num[i]!='e') // 识别整数
{
integer += (num[i] - '0');
integer *= 10;
}
if (flag == 1 && sci != 1) // 识别小数
{
dot += num[i] - '0';
dot *= 10;
}
if( sci==1 && sigmult == 1) // 处理指数
{
for(int k=num[i]-'0';k!=0;k--)
{
mult *= 10;
}
}
else if(sci==1 && sigmult == -1)
{
for(int k=num[i]-'0';k!=0;k--)
{
mult /= 10;
}
}
}
integer = integer / 10; // 处理整数
while (dot>=1) // 处理小数
{
dot=dot/10;
}
return (double)(sign*(integer+dot)*mult);
}
main()
{
char number[MAXLEN];
int c,i;
while((c=getchar())!='\n')
number[i++] = c;
number[i] = '\0';
printf("The number is %g.",atof(number));
}
输出:
2E-8
The number is 2e-008.
-.2e-8
The number is 2e-009.
2.658E3
The number is 2658.