atof()函数实现
atof() 函数
函数声明: double atof(const char *str );
功 能: 把字符串转换成浮点数
str:要转换的字符串。
函数返回:返回把字符串str开始部分的数字(和符号)字符转换为 double类型的值,跳过开始的空白字符,遇到第一个非数字 字符时结束转换,如果未发现数字字符(未能转化)则返回0;
个人认为:my_atof() 函数实现的核心是围绕是否有小数点展开的 即在字符 e或E 之前的实数
实现:
double my_atof(const char * str)
{int num=0; //用于记录数字字符的个数。int flag=0; //标记小数点的。flag==0时是没小数点的。int s=1; //符号位s . 第一个为'-'时,符号为负,s=-1.int sE=1; //字符 E或e 后第一个符号位sE 。当E或e后面第一个为'-'时,sE=-1.unsigned y=0; //E或e 后面的整数值.(即y次方)double item=10.0; //小数点后面sum的项;double sum=0.0; //浮点数值.char ch[]="0123456789-+."; //第一个非空白字符 浮点数字符 的组成。while(*str != '\0') //判断字符串是否为空字符串 不用if 而用while只要是为了方便用break{while(isspace(*str)) //跳过空白字符 isspace()函数在<ctype.h>头文件里{str++;}if(strchr(ch,*str)==NULL) //第一个非空白字符不是浮点数字符的,则退出循环 strchr()函数是 <string.h>头文件里break;//判断是否有小数点if(*str == '-' || *str == '+' || *str == '.') //第一个字符是否为符号或小数点{if(*str == '-' || *str == '+') //第一个字符是否为符号 {if(*str == '-') //符号位为负 s = -1;str++;if(*str == '.') //判断有符号后第一个字符是否为小数点{flag=1; //表示有小数点了。str++;}}else //第一个字符为小数点 相当于if(*str == '.'){flag=1; //表示有小数点了。 str++;}}//围绕小数点展开if(flag==0) //没有小数点 {while(*str >= '0' && *str <= '9') //或者用: char ch[]="0123456789"; while(strchr(ch,*str)!=NULL){ sum = sum * 10 + (*str-'0') ; //整数部分 *str-'0'的值为0到9之间。例如: '9'-'0' == 57-48 == 9num++; //记录数字字符个数。str++;}if(*str == 'E' || *str == 'e' || *str == '.') //整数部分后面跟小数点、E或e{if(*str == '.') //小数点后面的小数部分{str++;while(*str >= '0' && *str <= '9') //或者用: char ch[]="0123456789"; while(strchr(ch,*str)!=NULL){ sum += (*str-'0') / item ; //小数部分 item初始值为10.0. item *= 10.0;num++; //记录数字字符个数。str++;}}}else //整数部分后面不跟小数点、E或e 退出循环break;}else //有小数点。 相当于if(flag != 0){while(*str >= '0' && *str <= '9') //或者用: char ch[]="0123456789"; while(strchr(ch,*str)!=NULL){ sum += (*str-'0') / item ; //小数部分 item初始值为10.0. item *= 10.0 ;num++; //记录数字字符个数。str++;}}//上面为字符 E或e 之前的实数部分,而 E或e 之后是一样的。if(*str == 'E' || *str == 'e') //小数部分后跟 E或e 字符 {if(num == 0) //如果E或e之前没有数字字符 即E的左边没数字 则退出循环 返回值为0break;str++;if(*str == '-' || *str == '+' ) //E或e后的第一个字符是否为符号{if(*str == '-')sE = -1; //指数是负数str++;}while(*str >= '0' && *str <= '9') { y = y * 10 + (*str-'0') ; //计算指数部分的整数值str++;}if(*str < '0' || *str > '9' ) //必成立的,指数部分的数字字符完了就退出循环 不要if条件直接break也可以break; }else //小数部分后不跟E或e 则退出循环break; }if(y > 0) //指数部分有非0的正整数值。 y==0 时,10的0次方等于1 故不作判断了。{if(sE > 0) //指数为正整数:sum*=10 (相当于sE==1){while(y > 0){sum *= 10.0 ;y--;}}else //指数为负整数:sum/=10 (相当于sE==-1){while(y > 0){sum /= 10.0 ;y--;}}}return sum*s; //单个出口
}
atof()函数实现相关推荐
- atoll找不到标识符c语言,C/C++编程笔记:C++中的atol,atoll和atof函数
1.atol() 此函数将作为参数传递给函数调用的C类型字符串转换为长整数.它解析C字符串str,将其内容解释为整数,并作为long int类型的值返回.该函数丢弃出现在字符串开头的空白字符,直到找到 ...
- C/C++ atof函数 - C语言零基础入门教程
目录 一.atof 函数简介 二.atof 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.atof 函数简介 在 st ...
- c语言atof函数_atof()函数与C ++中的示例
c语言atof函数 C ++ atof()函数 (C++ atof() function) atof() function is a library function of cstdlib heade ...
- 字符串函数---atof()函数详解及实现(完整版)
atof()函数 atof():double atof(const char *str ); 功 能: 把字符串转换成浮点数 str:要转换的字符串. 返回值:每个函数返回 double 值,此值由将 ...
- C++ atof函数
atof函数: 功能:将字串转换成浮点型数 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 doubl ...
- 新手第二课:atof()函数的头文件
今天根据书本介绍的例子想学习下atof()函数的用法,书上自习描述atof()的头文件,也就直接用#include<stdio.h>, 用GCC编译,通过,但是怎么弄函数的返回都感到怪怪的 ...
- 小tips --atoi函数 atof函数
初始学C语言时,学到ASCII码以及string之后,经常碰到将char或者string类型,但是想表达数据的一些变量或常量,这个时候要把它作为int类型的数据来使用得花费一点功夫.刷题看到某一官方题 ...
- stod/stoi 函数基本用法及与atof函数的对比
stoi函数: 将string类型转换成int类型的函数 stod函数: 将string类型转换成double类型的函数 atof函数: 将string类型转换成double类型的函数 stoi - ...
- java 实现atof函数
atof函数 将字符串转换为浮点数,此函数规则如下: 它会扫描参数 s 字符串,跳过前面的空白字符(例如空格,tab缩进等),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0' ...
最新文章
- Sql server 阻塞定位
- hihoCoder #1872 : Pythagorean triple
- PHP小语种网站开发,当阳小语种建站
- 为类添加方法java_Java 7 : 为接口类增加“public defender 方法”
- (转)Openlayers 2.X加载高德地图
- 【报告分享】第七次全国人口普查主要数据情况报告.pdf(附下载链接)
- java使用RSA加密方式实现数据加密解密
- 【洛谷p1164】小A点菜
- linux mysql优化_Linux上跑MySQL优化技巧
- Matlab根据广播星历表计算卫星坐标
- vista激活失败,无限重启
- js逆向系列之猿人学爬虫第13题
- k8s!Ingress服务
- uni-app框架开发app中出现的问题(持续更新中...)
- margin 重叠问题的理解
- 2018最新手机cpu排行
- [艺术创作]摄影构图的传统法则
- 【网络科学0】新的开始
- Shiro学习之RememberMe功能实现
- 乐高计算机游戏泡泡龙的目标,乐高5-6岁电子教参教案:(5)小小设计师(上、下)(110页)-原创力文档...