C语言atof函数的探索

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值