/*
atof函数实现字符串向double数据的转换,
*/
#include <stdio.h>
double myatof(const char *str);
int main()
{
//char str[20] = "sd sdf32.47e+2df";
char str[20] = "sd sdf32.47e2df";
{
//char str[20] = "sd sdf32.47e+2df";
char str[20] = "sd sdf32.47e2df";
double result = 0.0;
printf("the str is %s\n",str);
result = myatof(str);
printf("the result is %lf\n",result);
return 0;
}
}
double myatof(const char *str)
{
char flag = 0; //表示正数
double res = 0.0;
double d = 10.0;
int e = 0;
while(*str != '\0')
{
if( !(*str >= '0' && *str <= '9')) //找到字符串中的第一个数字
{
str++;
continue;
}
if(*(str-1) == '-')
{
flag = 1; //表示是一个负数
}
while(*str >= '0' && *str <= '9')
{
res = res *10.0 + (*str - '0');
str++;
}
if(*str == '.')
{
str++;
}
while(*str >= '0' && *str <= '9')
{
res = res + (*str - '0')/d;
d = d*10;
str++;
}
if(*str == 'e' || *str == 'E')
{
str++;
if(*str == '+')
{
str++;
while(*str >= '0' && *str <= '9')
{
e = e*10 + (*str - '0');
str++;
}
while(e>0)
{
res = res*10;
e--;
}
}
if(*str == '-')
{
str++;
while(*str >= '0' && *str <= '9')
{
e = e*10 + (*str - '0');
str++;
}
while(e>0)
{
res = res/10;
e--;
}
}
if(*str >= '0' && *str <= '9')
{
while(*str >= '0' && *str <= '9')
{
e = e*10 + (*str - '0');
str++;
}
while(e>0)
{
res = res*10;
e--;
}
}
}
{
char flag = 0; //表示正数
double res = 0.0;
double d = 10.0;
int e = 0;
while(*str != '\0')
{
if( !(*str >= '0' && *str <= '9')) //找到字符串中的第一个数字
{
str++;
continue;
}
if(*(str-1) == '-')
{
flag = 1; //表示是一个负数
}
while(*str >= '0' && *str <= '9')
{
res = res *10.0 + (*str - '0');
str++;
}
if(*str == '.')
{
str++;
}
while(*str >= '0' && *str <= '9')
{
res = res + (*str - '0')/d;
d = d*10;
str++;
}
if(*str == 'e' || *str == 'E')
{
str++;
if(*str == '+')
{
str++;
while(*str >= '0' && *str <= '9')
{
e = e*10 + (*str - '0');
str++;
}
while(e>0)
{
res = res*10;
e--;
}
}
if(*str == '-')
{
str++;
while(*str >= '0' && *str <= '9')
{
e = e*10 + (*str - '0');
str++;
}
while(e>0)
{
res = res/10;
e--;
}
}
if(*str >= '0' && *str <= '9')
{
while(*str >= '0' && *str <= '9')
{
e = e*10 + (*str - '0');
str++;
}
while(e>0)
{
res = res*10;
e--;
}
}
}
return res*(flag?-1:1);
}
}
}
}