/*
4-2 对atof函数进行扩充,使它可以处理形如123.45e-6的科学表示法,
其中,浮点数后面可能会跟着一个e或E已经一个指数(可能有正负号)
*/
#include <stdio.h>
#include <ctype.h>
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;
}
return sign*val/power;
}
double atof_new(char s[])
{
double val,power;
int i,sign,expSign,expNum;
int expRet = 1;
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;
}
val = sign*val/power;
if (s[i] == 'E'||s[i] == 'e')
{
i++;
if (s[i] == '+'||s[i] == '-')
{
expSign = (s[i] == '+')?1:-1;
i++;
}
else
{
expSign = 1;
}
for (expNum = 0;isdigit(s[i]);i++)
{
expNum = 10*expNum+s[i]-'0';
}
for (int k = 0;k<expNum;k++)
{
expRet *= 10;
}
if (expSign == 1)
{
return val*expRet;
}
else
{
return val/expRet;
}
}
else
{
return val;
}
}
void main()
{
char str[20] = "12.34";
char str1[20] = "12.34e-6";
double ret;
ret = atof_new(str);
printf("%2f\n",ret);
ret = atof_new(str1);
printf("%e\n",ret);
}
C程序设计语言练习4-2
最新推荐文章于 2021-04-23 13:02:27 发布