模拟实现C库的atoi和itoa

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

你可能感兴趣的:(C/C++)