实现myatoi函数

myatoi()函数堪称经典,我相信很多童鞋都可以做出来,但是要做好却不容易。下面来看看

myatoi()函数实现功能:(1)八进制,十进制,十六进制字符分别转整形数字

                                      (2)遇到'.'退出

                                      (3)有正负数

                                      (4)防止整形数字越界,INT_MAX,INT_MIN

                                      (5)开头空格跳过,中间遇到空格退出

看看是不是条件有点多啊,实现起来也是不容易的。

代码如下:

#include<assert.h>

#include<iostream>

int dec_atoi(const char* str, bool tag)
{
    assert(str != NULL);
    int sum = 0;
    int i = 0;
    while (str[i] != '\0' && isdigit(str[i]))//判断结尾和数据是否合法(整形数字)
    {
        char x = str[i] - '0';
        if (!tag)//正数
        {
            if ((INT_MAX - sum * 10) >= x)
            {
                sum = sum * 10 + x;
            }
            else
            {
                sum = INT_MAX;
                break;///不可丢,超出范围退出
            }
        }
        else
        {
            if ((INT_MAX + 1 - sum * 10) >= x )//此时sum为正数,(INT_MIN的绝对值比INT_MIN的值大1)
            {
                sum = sum * 10 + x;
            }
            else
            {
                sum = INT_MIN;
                break;
            }
        }
        ++i;不能忘记++i
    }
    return sum;
}

int otc_atoi(const char* str, bool tag)
{
    assert(str != NULL);
    int sum = 0;
    int i = 0;
    while (str[i] != '\0' && isdigit(str[i]) && str[i] != '8' && str[i] != '9')//8进制不能是数字8和9
    {
        char x = str[i] - '0';
        if (!tag)//正数
        {
            if ((INT_MAX - sum * 8) >= x)
            {
                sum = sum * 8 + x;
            }
            else
            {
                sum = INT_MAX;
                break;
            }
        }
        else
        {
            if ((INT_MAX - sum * 8) >= x - 1)
            {
                sum = sum * 8 + x;
            }
            else
            {
                sum = INT_MIN;
                break;
            }
        }
        ++i;
    }
    return sum;
}
int hex_atoi(const char* str, bool tag)
{
    assert(str != NULL);
    int sum = 0;
    int i = 0;
    while (str[i] != '\0' && isxdigit(str[i]))//判断是否是十六进制的数字和字母
    {
        if (!tag)//正数
        {
            char x = str[i];
            if ((INT_MAX - sum * 16) >= x)
            {
                if (isalpha(str[i]))//判断字符
                {

                    x = tolower(str[i]);
                    sum = sum * 16 + x - 'a' + 10;
                }
                else
                {
                    sum = sum * 16 + x - '0';
                }
            }
            else
            {
                sum = INT_MAX;
                break;///不可丢
            }
        }
        else
        {
            char x = str[i];
            if ((INT_MAX - sum * 16) >= x -1)
            {
                if (isalpha(str[i]))
                {

                    x = tolower(str[i]);
                    sum = sum * 16 + x - 'a' + 10;
                }
                else
                {
                    sum = sum * 16 + x - '0';
                }
            }
            else
            {
                sum = INT_MIN;
                break;
            }
        }
        ++i;
    }
    return sum;
}

int myatoi(const char* str)
{
    assert(str != NULL);
    if (NULL == str) return -1;
    int sum = 0;
    bool flag = 0;
    while (*str == ' ')
        str++;

    if (*str == '-')
    {
        flag = 1;
        str++;
    }
    if (*str == '+')
    {
        str++;
    }
    if (*str == '.')
    {
        return -1;
    }
    /*if (!isdigit(*str))
    {
        return -1;
    }*/
    if (*str == '0')
    {
        if (*(str+1) == 'x' || *(str+1) == 'X')///str+1不能是str++
        {
            sum = hex_atoi(str + 2, flag);//
        }
        else
        {
            sum = otc_atoi(str + 1, flag);else
        }
    }
    else
    {
        sum = dec_atoi(str, flag);
    }
    
    if (flag)
    {
        sum = -sum;
    }
    return sum;
}
int main()
{
    const char str[][20] = { "12321","-123","123.34","0xff","0X12","012","011","12g",
                                "0123456623455431234","-01234","-123.a","123456789098765",
                                "12345678","-12345678909876" };
    int len = sizeof(str) / sizeof(str[0]);
    for (int i = 0; i < len; ++i)
    {
        cout << str[i] << " -->" << myatoi(str[i]) << endl;
    }

    return 0;
}

 结果如下:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值