Fork me on GitHub

atoi(),atof等函数的实现

    atoi()函数的功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。

    atoi()函数实现的代码:

  1. /* 
  2. * name:xif 
  3. * coder:xifan@2010@yahoo.cn 
  4. * time:08.20.2012 
  5. * file_name:my_atoi.c 
  6. * function:int my_atoi(char* pstr) 
  7. */  
  8.   
  9. int my_atoi(char* pstr)  
  10. {  
  11.     int Ret_Integer = 0;  
  12.     int Integer_sign = 1;  
  13.       
  14.     /* 
  15.     * 判断指针是否为空 
  16.     */  
  17.     if(pstr == NULL)  
  18.     {  
  19.         printf("Pointer is NULL\n");  
  20.         return 0;  
  21.     }  
  22.       
  23.     /* 
  24.     * 跳过前面的空格字符 
  25.     */  
  26.     while(isspace(*pstr) == 0)  
  27.     {  
  28.         pstr++;  
  29.     }  
  30.       
  31.     /* 
  32.     * 判断正负号 
  33.     * 如果是正号,指针指向下一个字符 
  34.     * 如果是符号,把符号标记为Integer_sign置-1,然后再把指针指向下一个字符 
  35.     */  
  36.     if(*pstr == '-')  
  37.     {  
  38.         Integer_sign = -1;  
  39.     }  
  40.     if(*pstr == '-' || *pstr == '+')  
  41.     {  
  42.         pstr++;  
  43.     }  
  44.       
  45.     /* 
  46.     * 把数字字符串逐个转换成整数,并把最后转换好的整数赋给Ret_Integer 
  47.     */  
  48.     while(*pstr >= '0' && *pstr <= '9')  
  49.     {  
  50.         Ret_Integer = Ret_Integer * 10 + *pstr - '0';  
  51.         pstr++;  
  52.     }  
  53.     Ret_Integer = Integer_sign * Ret_Integer;  
  54.       
  55.     return Ret_Integer;  
  56. }  

    现在贴出运行my_atoi()的结果,定义的主函数为:int  main  ()

  1. int main()  
  2. {  
  3.     char a[] = "-100";  
  4.     char b[] = "456";  
  5.     int c = 0;  
  6.       
  7.     int my_atoi(char*);   
  8.   
  9.     c = atoi(a) + atoi(b);  
  10.       
  11.     printf("atoi(a)=%d\n",atoi(a));  
  12.     printf("atoi(b)=%d\n",atoi(b));  
  13.     printf("c = %d\n",c);  
  14.   
  15.     return 0;  
  16. }  

头文件:#include <stdlib.h>函数 atof() 用于将字符串转换为双精度浮点数(double),其原型为:
double atof (const char* str);
atof() 的名字来源于 ascii to floating point numbers 的缩写,它会扫描参数str字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。参数str 字符串可包含正负号、小数点或E(e)来表示指数部分,如123. 456 或123e-2。
【返回值】返回转换后的浮点数;如果字符串 str 不能被转换为 double,那么返回 0.0。

温馨提示:ANSI C 规范定义了 stof()atoi()atol()strtod()strtol()strtoul() 共6个可以将字符串转换为数字的函数,大家可以对比学习;使用 atof() 与使用 strtod(str, NULL) 结果相同。另外在 C99 / C++11 规范中又新增了5个函数,分别是 atoll()、strtof()、strtold()、strtoll()、strtoull()。

 

#include<iostream>

using namespace std;

double atof_my(const char *str)
{
    double s=0.0;

    double d=10.0;
    int jishu=0;

    bool falg=false;

    while(*str==' ')
    {
        str++;
    }

    if(*str=='-')//记录数字正负
    {
        falg=true;
        str++;
    }

    if(!(*str>='0'&&*str<='9'))//如果一开始非数字则退出,返回0.0
        return s;

    while(*str>='0'&&*str<='9'&&*str!='.')//计算小数点前整数部分
    {
        s=s*10.0+*str-'0';
        str++;
    }

    if(*str=='.')//以后为小树部分
        str++;

    while(*str>='0'&&*str<='9')//计算小数部分
    {
        s=s+(*str-'0')/d;
        d*=10.0;
        str++;
    }

    if(*str=='e'||*str=='E')//考虑科学计数法
    {
        str++;
        if(*str=='+')
        {
            str++;
            while(*str>='0'&&*str<='9')
            {
                jishu=jishu*10+*str-'0';
                str++;
            }
            while(jishu>0)
            {
                s*=10;
                jishu--;
            }
        }
        if(*str=='-')
        {
            str++;
            while(*str>='0'&&*str<='9')
            {
                jishu=jishu*10+*str-'0';
                str++;
            }
            while(jishu>0)
            {
                s/=10;
                jishu--;
            }
        }
    }

    return s*(falg?-1.0:1.0);
}

int main()
{
    char *s1="  123.456567567e-10";
    char *a1="  123.456567567e-10";
    
    char *s2="1234567.235e+10";
    char *a2="1234567.235e+10";

    char *s3="  123.45656\07567e-10";
    char *a3="  123.45656\07567e-10";

    double sum_1=atof_my(s1);
    double sum1=atof(a1);

    double sum_2=atof_my(s2);
    double sum2=atof(a2);

    double sum_3=atof_my(s3);//遇到'\0'结束
    double sum3=atof(a3);
    
    cout<<"atof_my:"<<sum_1<<endl;
    cout<<"atof   :"<<sum1<<endl;

    cout<<"atof_my:"<<sum_2<<endl;
    cout<<"atof   :"<<sum2<<endl;

    cout<<"atof_my:"<<sum_3<<endl;
    cout<<"atof   :"<<sum3<<endl;
    
    system("pause");
    return 0;
}

 

 

 

posted @ 2016-03-29 23:59  ranjiewen  阅读(1485)  评论(0编辑  收藏  举报