模拟实现C库的atoi和itoa

来源:互联网 发布:佳为软件 编辑:程序博客网 时间:2024/06/06 09:23

1、C库的atoi的模拟实现
atoi的作用就是将字符串转为整形,它的接口函数是:

int atoi ( const char * str );

要模拟实现C库的atoi函数需要考虑以下几种特殊情况:
1>、空串,返回0
2>、是否存在空格,如果全部是空格呢?全部是空格,返回0
3>、是否存在符号位
4>、符号位之后是否是全0,返回0
5>、是否存在特殊字符,特殊字符指的是字母,字符,空格等(指出现在正确的数字之后的特殊字符)
6>、是否会溢出,溢出了如何解决?
7>、空串和全部是空格或者全部是0都返回的是正数0,如何区分这种情况呢?设置一个全局的变量,如果是不同的情况则设置成不同的值。
代码实现如下:

enum State{    EMPTY,    ALLZERO,    ALLSPACE,};int state = EMPTY;  //该全局变量是用来决定返回的0是哪一个情况int Atoi(const string& str){    int num = 0;    if (str.empty())    //是空串        return 0;    char *pstr = (char *)str.c_str();    while (isspace(*pstr))//是否存在空格    {        ++pstr;    }    if (*pstr == '\0')    //全部是空格    {        state = ALLSPACE;        return 0;    }    //确定符号位    int flag = 1;   //正数    if (*pstr == '-')    {        flag = -1;        pstr++;    }    else if (*pstr == '+')    {        pstr++;    }    while (*pstr == '0')  //判断是否存在0    {        pstr++;    }    if (*pstr == '\0')    //全部是字符0    {        state = ALLZERO;        return 0;    }    while (*pstr != '\0')    {        if (isdigit(*pstr))  //是数字        {            num = num * 10 + flag*(*pstr - '0');            if ((flag == 1 && num >= 0x7FFFFFFF) || (flag == -1 && num <= 0x80000000) )   //判断是否溢出            {                num = 0;            }        }        ++pstr;    }    return num;}

2、C库的itoa的模拟实现
itoa的作用就是将整形转为字符串,它的接口函数是:

char *  itoa ( int value, char * str, int base );

需要考虑负数的情况
代码实现如下:

void Itoa(int num, char *str){    char *left = str;    int flag = num;    if (num < 0)   //考虑到负数的情况        num = -num;    while (num > 0)    {        *str++ = num % 10 + '0';        num /= 10;    }    if (flag < 0)    {        *str++ = '-';    }    *str = '\0';    //此时是逆序存放的,需要翻转过来    char *right = str - 1;    while (left < right)    {        char tmp = *left;        *left = *right;        *right = tmp;        ++left;        --right;    }}