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. .NET中国峰会议题征集
  2. fastjson导致的OOM
  3. shell 判断文件是否存在,没有则创建
  4. spring2.5.4+hibernate3.2.6+struts2+jbpm3.2.2
  5. Smart/400开发上手2: COBOL批处理程序处理过程
  6. (8)Node.js 模块介绍
  7. 易错丨Oracle 每日一题系列合集
  8. 数据结构与算法--图的概念
  9. 数据分类是否一定要求样本均衡
  10. 学术研究 | 仅仅因为方法 Too Simple 就被拒稿,合理吗?
  11. 卡尔曼滤波(Kalman filtering)算法学习小记
  12. 铁蛋白-AHLL纳米颗粒|人表皮生长因子-铁蛋白重链亚基纳米粒子(EGF-5Cys-FTH1)|铁蛋白颗粒包载氯霉素Chloramphenicol-Ferritin
  13. linux查看已安装的软件
  14. xhprof安装使用
  15. c语言怎么让行末没有空格,新人提问:如何将输出时每行最后一个空格删除
  16. css内边距外边距和边框
  17. 明源售楼系统技术解析 MVC架构与房源生成(一)
  18. 求[X,Y]内被除3余1并且被除5余3的整数的和
  19. Hadoop ResourceManager:
  20. python批量下载文件教程_超简单超详细python小文件、大文件、批量下载教程

热门文章

  1. 求n的阶乘和求n的阶乘和——两种方法
  2. 今年出现了5种电子商务SEO趋势
  3. layui制作二维码
  4. 3分钟学会在C ++中以编程方式合并Excel工作表中的单元格
  5. Nachos系统简介
  6. 在Excel实现多关键字批量搜索、批量替换,以及批量添加批注
  7. step by step 构建嵌入式Linux系统平台
  8. 人人都说的SaaS,你真的了解它吗?
  9. 616 java实现发红包案例
  10. javascript 获取当前日期 月份 时间