现在的位置: 首页 > 综合 > 正文

atof实现(c++)

2018年12月17日 ⁄ 综合 ⁄ 共 1685字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.