atof实现(c++)
来源:互联网 发布:java reference 编辑:程序博客网 时间:2024/06/08 09:02
aotf是c++里的一个函数,将字符串转转换成double返回,double atof(const char *);
这里我做了一些函数头的修改,形参为一个string和一个double &,double用来存储转换后的结果。
下面的程序通过输入字符串,首先调用我自己写的atof,然后调用标准库的atof来做对比,输入exit退出。
我的这个代码不支持科学计数法,懒得写了,思路就是先做空格处理,然后找到第一个’e',如果有的话,然后分割成两个字符串,计算各自的值,然后在将得到的两个值做处理。
#include <iostream>#include <string>#include <set>#include <cstdlib>using namespace std;bool atof_(string s, double &ans){ set<char> sets; for(char a = '0'; a <= '9'; a++) //存储0-9合法字符 sets.insert(a); ans = 0.0; double n = 1.0; //处理小数点 int pos = 0, neg = 0, pot = 0, flag = 0; //pos表示‘+’个数,neg代表‘-’个数,pot代表‘.'个数,flag判断是否读入了小数点 int i = 0, m = s.size() - 1; //将字符串前后第一个非空格的位置 while(s[i] == ' ') i++; while(s[m] == ' ') m--; for(; i <= m; i++){ if(sets.count(s[i])){ //如果是0-9,如果flag=0,说明还没有小数点,此时ans要*10,如果有了小数点,需要去/10, //是为了保证要添加的数的位数,所以这里用了n = 1.0,每一次都要后退一位。 int j = s[i] - '0'; if(flag == 0) ans *= 10; else n /= 10; ans += n * j; continue; }else if(s[i] == '-' || s[i] == '+' || s[i] == '.'){ if(m == i) //如果这三个字符是结束字符,认为是非法,在return后,ans是上一次计算时得到的合法数据,也就是抛弃了不合法的数据 return false; if(s[i] == '-'){ neg++; } if(s[i] == '+'){ pos++; } if(s[i] == '.'){ pot++; flag++; } if(pos + neg > 1 || pot > 1) //如果+-总和出现2次,或者小数点出现两次,说明非法 return false; }else return false; } if(neg) //如果有’-‘, ans = -ans; return true;}int main(){ string s; do { getline(cin, s); double b = 0.0; if(atof_(s,b)) cout << "true "; else cout << "false "; cout << b << endl; cout << atof(s.c_str()) << endl; //这个输出了真正调用atof的结果,输入exit结束 }while(s != "exit"); return 0;}
0 0
- atof实现(c++)
- atof c语言实现
- C语言 atof()的实现
- C函数的实现(strcpy,atoi,atof,itoa,reverse)
- C语言实现atoi,itoa和atof
- C语言实现atoi和atof函数
- 编程实现C函数 atoi atof
- 【C语言】编写函数实现库函数atof
- C 标准库 atof 函数的实现
- [C语言]模拟实现C语言库函数atof
- 用c语言实现一个自己的atof()函数
- 【c语言】模拟实现库函数的atof函数
- C语言50题之模拟实现atof、atoi
- C/C++ atoi、atof与itoa函数的实现
- C++atoi与atof
- atoi,atof实现
- atof简单实现
- atof简单实现
- C、C++运算符优先级列表
- HTML位置感知
- Multiply Strings
- oj抽象类
- C++阳历转阴历算法及实现
- atof实现(c++)
- SD卡驱动-源代码树分析
- 最大公约数(递归与非递归实现),最小公倍数
- 在 CodeIgniter 2中集成 Smarty 3 模板引擎
- 通过连接池和字段索引,提升单点登录cas的性能
- 详解CSS相对定位,绝对定位与固定定位
- java基础加强_JDK1.5线程并发库
- ftk学习记(滑动条篇)
- iOS学习:UILabel和sizeWithFont方法