atoi()函数实现

虽然网上可以看到很多atoi()函数的实现方法,但是就函数功能和健壮性上来将却是不尽相同。这里我以自己对函数功能和容错性的理解,实现atoi()函数。

步骤:<1>判断传入指针是否为空

  <2>声明变量保存结果和符号

  <3>跳过字符串开头的空格(如果有)

  <4>记录字符串开头的符号(如果有)

  <5>判断字符是否为数字。如果是加入结果变量;如果不是结束循环。

  <6>判断数字正负并输出。

#include <iostream>
#include "assert.h"

using namespace std;

int atoi(char *s)
{
    //判断指针是否为零
    assert(s != NULL);

    //声明变量保存结果和正负符号
    long long result = 0;
    int flg = 1;

    //跳过开头空格部分
    while(*s == ' ')
    {
        s++;
    }

    //记录符号位
    if(*s == '-')
    {
        flg = -1;
        s++;
    }
    if(*s == '+')
    {
        flg = 1;
        s++;
    }

    //判断字符是否为数字。是数字加入结果变量/不是数字结束循环
    while(*s<='9' && *s>='0')
    {
        result = result * 10 + *s - '0';
        s++;

        //数值如果超出int的表示范围 返回
        if(result > 0x7FFFFFFF)
        {
            if(flg == 1)
            {
                cout<<"Beyond the range of int ";
                return 0;
            }
            else
            {
                if(result > 0x80000000)
                {
                    cout<<"Beyond the range of int ";
                    return 0;
                }
            }
        }
    }

    //判断正负并输出
    if(flg == 1)
    {
        return (int)result;
    }
    else
    {
        return (int)result * flg;
    }
}

说明1)0x7FFFFFF是int能表示的最大正整数,又因为result为long long 型所以0x7FFFFFFF也会被隐式转换为long long。

          2)0x80000000是int能表示的最小负整数是负数,又因为被隐式转换为long long 型所以变为正数,所以当做正数来比较(看待)。

          3)result使用long long型而不使用unsigned int型的原因是后者可能会出现溢出,而且溢出之后的结果依旧可以符合条件不报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值