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
原创粉丝点击