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()函数实现相关推荐

  1. atoll找不到标识符c语言,C/C++编程笔记:C++中的atol,atoll和atof函数

    1.atol() 此函数将作为参数传递给函数调用的C类型字符串转换为长整数.它解析C字符串str,将其内容解释为整数,并作为long int类型的值返回.该函数丢弃出现在字符串开头的空白字符,直到找到 ...

  2. C/C++ atof函数 - C语言零基础入门教程

    目录 一.atof 函数简介 二.atof 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.atof 函数简介 在 st ...

  3. c语言atof函数_atof()函数与C ++中的示例

    c语言atof函数 C ++ atof()函数 (C++ atof() function) atof() function is a library function of cstdlib heade ...

  4. 字符串函数---atof()函数详解及实现(完整版)

    atof()函数 atof():double atof(const char *str ); 功 能: 把字符串转换成浮点数 str:要转换的字符串. 返回值:每个函数返回 double 值,此值由将 ...

  5. C++ atof函数

    atof函数: 功能:将字串转换成浮点型数 相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 #include <stdlib.h> 定义函数 doubl ...

  6. 新手第二课:atof()函数的头文件

    今天根据书本介绍的例子想学习下atof()函数的用法,书上自习描述atof()的头文件,也就直接用#include<stdio.h>, 用GCC编译,通过,但是怎么弄函数的返回都感到怪怪的 ...

  7. 小tips --atoi函数 atof函数

    初始学C语言时,学到ASCII码以及string之后,经常碰到将char或者string类型,但是想表达数据的一些变量或常量,这个时候要把它作为int类型的数据来使用得花费一点功夫.刷题看到某一官方题 ...

  8. stod/stoi 函数基本用法及与atof函数的对比

    stoi函数: 将string类型转换成int类型的函数 stod函数: 将string类型转换成double类型的函数 atof函数: 将string类型转换成double类型的函数 stoi - ...

  9. java 实现atof函数

    atof函数 将字符串转换为浮点数,此函数规则如下: 它会扫描参数 s 字符串,跳过前面的空白字符(例如空格,tab缩进等),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0' ...

最新文章

  1. Sql server 阻塞定位
  2. hihoCoder #1872 : Pythagorean triple
  3. PHP小语种网站开发,当阳小语种建站
  4. 为类添加方法java_Java 7 : 为接口类增加“public defender 方法”
  5. (转)Openlayers 2.X加载高德地图
  6. 【报告分享】第七次全国人口普查主要数据情况报告.pdf(附下载链接)
  7. java使用RSA加密方式实现数据加密解密
  8. 【洛谷p1164】小A点菜
  9. linux mysql优化_Linux上跑MySQL优化技巧
  10. Matlab根据广播星历表计算卫星坐标
  11. vista激活失败,无限重启
  12. js逆向系列之猿人学爬虫第13题
  13. k8s!Ingress服务
  14. uni-app框架开发app中出现的问题(持续更新中...)
  15. margin 重叠问题的理解
  16. 2018最新手机cpu排行
  17. [艺术创作]摄影构图的传统法则
  18. 【网络科学0】新的开始
  19. Shiro学习之RememberMe功能实现
  20. 乐高计算机游戏泡泡龙的目标,乐高5-6岁电子教参教案:(5)小小设计师(上、下)(110页)-原创力文档...

热门文章

  1. python字典的常用方法有哪些_python中字典常用方法
  2. 3dmax制作玻璃杯液体材质
  3. postgresql启动1053错误
  4. 大型数据中心维保外包模式的选择
  5. itol绘制高颜值的进化树
  6. 第十五章: 菱悦 -垃圾回收GC详解
  7. 什么是jQuery,jQuery选择器
  8. 如何使用miniconda(小白入门版)
  9. PHP集群中SESSION共享方案之Redis
  10. 正点原子 核心板IMX6ULL IIC RTC驱动 PCF8563