C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

自己实现的atof()和atoi()代码

Posted on 2012-02-24 16:42 C小加 阅读(8195) 评论(5)  编辑 收藏 引用 所属分类: C++和面向对象
//函数名:myatof
//功能:把字符串转化成double浮点型
//名字来源:my array to floating point numbers  
//函数说明:接收一个字符串判断第一个字符的符号,没有符号默认为正值,然后对剩余字符串进行转换,//遇到\0结束,最后返回一个double

double myatof(const char* sptr)
{
    double temp=10;
    bool ispnum=true;
    double ans=0;
    if(*sptr=='-')//判断是否是负数
    {
        ispnum=false;
        sptr++;
    }
    else if(*sptr=='+')//判断是否为正数
    {
        sptr++;
    }

    while(*sptr!='\0')//寻找小数点之前的数
    {
        if(*sptr=='.'){ sptr++;break;}
        ans=ans*10+(*sptr-'0');
        sptr++;
    }
    while(*sptr!='\0')//寻找小数点之后的数
    {
        ans=ans+(*sptr-'0')/temp;
        temp*=10;
        sptr++;
    }
    if(ispnum) return ans;
    else return ans*(-1);
}

//函数名:myatoi
//功能:把字符串转化成int整型
//名字来源:my array to integer  
//函数说明:接收一个字符串判断第一个字符的符号,没有符号默认为正值,然后对剩余字符串进行转换,//遇到\0结束,最后返回一个int

int myatoi(const char* sptr)
{

    bool ispnum=true;
    int ans=0;
    if(*sptr=='-')//判断是否是负数
    {
        ispnum=false;
        sptr++;
    }
    else if(*sptr=='+')//判断是否为正数
    {
        sptr++;
    }

    while(*sptr!='\0')//类型转化
    {
        ans=ans*10+(*sptr-'0');
        sptr++;
    }

    if(ispnum) return ans;
    else return ans*(-1);
}

Feedback

# re: 自己实现的atof()和atoi()代码[未登录]  回复  更多评论   

2012-02-24 19:53 by ithaca
没有处理前置的空白,这个功能,标准的atoi都是要有的。

# re: 自己实现的atof()和atoi()代码  回复  更多评论   

2012-02-25 21:24 by ko
正数不一定非要用 + 占位吧

# re: 自己实现的atof()和atoi()代码  回复  更多评论   

2012-02-27 09:10 by C小加
遇到+了怎么办@ko

# re: 自己实现的atof()和atoi()代码  回复  更多评论   

2013-11-09 11:25 by danielyin
atoi没有考虑溢出的问题。

# re: 自己实现的atof()和atoi()代码  回复  更多评论   

2014-09-05 22:27 by memristor
定义函数 double atof(const char *nptr);
函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数
字或正负符号才开始做转换,而再遇到非数字或字符串结束时
('\0')才结束转换,并将结果返回。参数nptr字符串可包含正负
号、小数点或E(e)来表示指数部分,如123.456或123e-2。
返回值 返回转换后的浮点型数。
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <stdlib.h>
#include <assert.h>


double myatof(const char*s)
{
assert(s!=NULL);
double val,val2,power;
int sign,sign2,i;
//去掉字符串中的空格
for(i=0;isspace(s[i]);++i)
;
//判断正负数 ,并将i指向下一个位置
sign = (s[i] == '-') ? -1:1;
if(s[i] == '+' || s[i] == '-')
i++;
//取浮点数的整数部分
for(val=0.0;isdigit(s[i]) && s[i] !=0;++i)
val = 10*val+s[i]-'0';
//取小数点
if(s[i] == '.')
i++; //后一个位置
//取小数点后面数
for(power=1.0;isdigit(s[i]) && s[i] !=0;++i)
{
val = 10*val+s[i]-'0';
power*=10; //float 放大的倍数
}
val=sign*val/power;

//如果有e的话处理e后面的数字
if(s[i]=='e' || s[i]== 'E'){
i++;
sign2 = (s[i] == '-')?-1:1;
if(s[i] == '+' || s[i] == '-')
i++;
for(val2=0.0;isdigit(s[i]) && s[i] !=0;++i){
val2 = 10*val2+s[i]-'0';
}
if(sign2 == -1)
return val/pow(10,val2);
else
return val*pow(10,val2);
}
return val;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理