#include <stdio.h>
#include <stdlib.h> //USING atof
double atofM1(char s[]);
double atofM2(char *s);
double atofM3(char *s);
int main(void)
{
char s[]=" \t \n -987654.9962abc";
printf("%lf\n",atof(s));
printf("%lf\n",atofM1(s));
printf("%lf\n",atofM2(s));
printf("%lf\n",atofM3(s));
return 0;
}
/*******************函数区***************************/
//版本1:用数组下标便利字符串
#include <ctype.h> //USING: isspace,isdigit
double atofM1(char s[])
{
double val = 0.0, power = 1.0;
int i, sign;
for (i = 0; isspace(s[i]); ++i) //跳过可能有的空白符
;
sign = (s[i] == '-') ? -1 : 1; //获取可能有的正负号
if (s[i] == '+' || s[i] == '-') //如有符号,则跳过
++i;
for ( ; isdigit(s[i]); ++i) //遍历字符串获取整数
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.') //跳过可能有的小数点
++i;
for( ; isdigit(s[i]); ++i) //获取小数部分
{
val = 10.0 * val + (s[i] - '0'); //小数当整数吃
power *= 10.0; //悄悄记录小数点移动
}
return sign * val / power; //安装符号与小数点
}
//版本2:用指针遍历字符串
#include <ctype.h>
double atofM2(char *s)
{
double val = 0.0, power = 1.0;
char sign;
char *p = s;
for ( ; isspace(*p); ++p)
;
sign = (*p == '-' || *p == '+') ? *p++ : '+';
for ( ; isdigit(*p); ++p)
val = 10.0 * val + (*p - '0');
if (*p == '.')
++p;
for ( ; isdigit(*p); ++p)
{
val = 10.0 * val + (*p - '0');
power *= 10.0;
}
val = val / power; //安装小数点
return (sign == '-') ? -val : val; //安装符号
}
//版本3:局方仿照标准库stdlib.h里的_Stoul函数
//The Standard C Library P358
#include <ctype.h>
#include <string.h> //USING: memchr
double atofM3(char *s)
{
char digits[]="0123456789"; //理应有static const修饰
double val = 0.0, power = 1.0;
char sign; //注意:标准库采用char类型
char *p = s, *sd; //sd用来在digits里检索字符
for ( ;isspace(*p); p++)
;
sign = (*p == '-' || *p == '+') ? *p++ : '+';//库惯用法
sd = p; //memchr返回*p在digits前10个字符第一次出现的指针
for ( ; ((sd = memchr(digits, *p, 10)) != NULL); p++)
val = 10.0 * val + (sd - digits);
if (*p == '.')
p++;
for ( ; ((sd = memchr(digits, *p, 10))!= NULL); p++)
{
val = 10.0 * val + (sd - digits);
power *= 10.0;
}
val = val / power; //安装小数点
return (sign == '-') ? -val : val; //原来是这样安装符号
}
//附件:自写简易的memchr()函数(包含于string.h)
void *memchrM(const void *s, int c, size_t n)
{
const unsigned char uc = c;
const unsigned char *su;
for (su = s; 0 < n; ++su, --n)
if (*su == uc)
return (void *)su;
return NULL;
}
C语言atof函数的探索
最新推荐文章于 2024-04-28 21:03:18 发布