double my_atof(char const *str);
int main()
{
char src[] = " -456.78999";
printf("%lf",my_atof(src));
return 0;
}
double my_atof(char const *str)
{
char const *p = NULL ;
int num;
double ret = 0;
int sign = 0 ;
while(isspace(*str))
str++;
if(*str == '-')
{
sign = -1;
str++;
}
else
{
sign = 1;
}
while(isdigit(*str))
{
ret = ret * 10 +(*str-'0');
str++;
}
if(*str == '.')
{
//p = str;
p = str + 1;
//str ++;
}
str ++;
while(isdigit(*str))
{
ret = ret * 10 + (*str - '0');
str ++;
}
num = pow(10,(str - p));
return (ret * sign) / num;
}
这里用到了指针减指针以获得小数点之后的数字字符个数,指针减指针得到的是两个指针之间的数组元素个数,这种方法只能用于数组,也就是连续开辟的存储空间才能使用指针减指针。
pow()函数是包含在 math.h 文件中的函数,用法为pow(10,N) 表示10的N次方,以此类推pow(M, N)就表示M的N次方。
此处还有个需要注意的地方,const 修饰的指针只能赋给同样被const 修饰的指针!
*************************************************************************************************************************************************************************************************
#include#include#includedouble my_atof(char const *src);
int main()
{
double S_num;
char str[] = " -123.456";
printf("%lf",my_atof(str));
return 0;
}
double my_atof(char const *src)
{
double Front_num = 0.0, After_num = 1.0;
int flag;
assert(src != NULL); //判断字符串是否为空
while(isspace(*src))
{
src++;
}
/*
flag = (*src == '-')?-1:1; //此处可以用三目运算符,也可以直接用if 语句判断,没有本质区别
if(*src == '-' || *src == '+')
{
src ++;
}
*/
if(*src == '-')
{
flag = -1;
src++;
}
else flag = 1;
while(isdigit(*src))
{
Front_num = Front_num * 10.0 + (*src - '0'); //Front_num是存储浮点数的,从第一个数字开始
src ++;
if(*src == '.')
{
src++;
break;
}
}
while(isdigit(*src))
{
Front_num = Front_num * 10.0 + (*src - '0');
After_num = After_num * 10.0;//After_num是用来计小数点之后的数字字符位数
src ++;
}
return flag*(Front_num / After_num);
}
这两个程序实现的功能是一样,基本思想也都一样,思路也很简单。
我正走在成为程序员的路上,写这篇文章贻笑方家了