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; }