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