atoi 和 itoa的实现

来源:互联网 发布:喜马拉雅网络无法连接 编辑:程序博客网 时间:2024/06/05 07:53

atoi 和 itoa的实现

转载:http://www.cnblogs.com/cobbliu/archive/2012/08/25/2656176.html

atoi 和 itoa是面试笔试经常要考到的题目,下面两份代码是用C语言实现的atoi和itoa:

1, atoi

原型: int atoi(const char *nptr);

函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。

复制代码
#include <stdio.h>#include <assert.h>static int atoi(const char* str){    int result = 0;    int sign = 0;    assert(str != NULL);    // proc whitespace characters    while (*str==' ' || *str=='\t' || *str=='\n')        ++str;    // proc sign character    if (*str=='-')    {        sign = 1;        ++str;    }    else if (*str=='+')    {        ++str;    }    // proc numbers    while (*str>='0' && *str<='9')    {        result = result*10 + *str - '0';        ++str;    }    // return result    if (sign==1)       return -result;    else       return result;} 
复制代码

2. itoa

char *itoaint value, char *string,int radix);

  原型说明:

  value欲转换的数据。

  string:目标字符串的地址。

  radix:转换后的进制数,可以是10进制、16进制等

复制代码
char *itoa(int val, char *buf, unsigned radix){    char   *p;                 char   *firstdig;          char   temp;               unsigned   digval;         p = buf;    if(val <0)    {        *p++ = '-';        val = (unsigned long)(-(long)val);    }    firstdig = p;     do{        digval = (unsigned)(val % radix);        val /= radix;               if  (digval > 9)            *p++ = (char)(digval - 10 + 'a');         else            *p++ = (char)(digval + '0');          }while(val > 0);       *p-- = '\0 ';             do{        temp = *p;        *p = *firstdig;        *firstdig = temp;        --p;        ++firstdig;            }while(firstdig < p);      return buf;}
复制代码

另外还写 float 与 字符串 转换,代码如下

 

     

/*
 *File : ftoa.c
 */

/*Float ===> String*/

int ftoa(char *str, float num, int n)        //n是转换的精度,即是字符串'.'后有几位小数
{
    int     sumI;
    float   sumF;
    int     sign = 0;
    int     temp;
    int     count = 0;

    char *p;
    char *pp;

    if(str == NULL) return -1;
    p = str;

    /*Is less than 0*/
    if(num < 0)
    {
        sign = 1;
        num = 0 - num;
    }

    sumI = (int)num;    //sumI is the part of int
    sumF = num - sumI;  //sumF is the part of float

    /*Int ===> String*/
    do
    {
        temp = sumI % 10;
        *(str++) = temp + '0';
    }while((sumI = sumI /10) != 0);


    /*******End*******/

 


    if(sign == 1)
    {
        *(str++) = '-';
    }

    pp = str;
   
    pp--;
    while(p < pp)
    {
        *p = *p + *pp;
        *pp = *p - *pp;
        *p = *p -*pp;
        p++;
        pp--;
    }

    *(str++) = '.';     //point

    /*Float ===> String*/
    do
    {
        temp = (int)(sumF*10);
        *(str++) = temp + '0';

        if((++count) == n)
            break;
   
        sumF = sumF*10 - temp;

    }while(!(sumF > -0.000001 && sumF < 0.000001));

    *str = '/0';

    return 0;

}

 

 

/*
 * File : atof.c
 */

/*String ===> Float*/

float atof(const char *str)
{
    float   sumF = 0;
    int     sumI = 0;
    int     sign = 0;

    if(str == NULL) return -1;
   
    /*Is less than 0 ?*/
    if(*str == '-')
    {
        sign = 1;
        str++;
    }

    /*The part of int*/
    while(*str != '.')
    {
        sumI = 10*sumI + (*str - '0');
        str++;
    }

    /*Let p point to the end*/
    while(*str != '/0')
    {
        str++;
    }

    str--;          //Your know!

    /*The part of float*/
    while(*str != '.')
    {
        sumF = 0.1*sumF + (*str - '0');
        str--;
    }

    sumF = 0.1*sumF;

    sumF += sumI;

    if(sign == 1)
    {
        sumF = 0 - sumF;
    }

    return sumF;

}
 


0 0
原创粉丝点击