模拟实现 atoi 函数

一、函数介绍

原型 

int atoi(const char *nptr);

二、使用atoi

三、使用发现

可以发现:会先过滤掉空格,还能识别正负号,当第一次遇到正负号了,后面没接着是数字就返回0,
如果+45 5aa 结果是45,说明前面识别了数字,如果后面被中断了,转换也就停止了
第一个不是数字也就返回0 

四、模拟实现

int sign = 0;//作为合法与非法转换的标志
int My_atoi(const char* str)
{
    int flag = 1;  //做符号标识
    long long  ret = 0;  //用来存储字符串转换的数字,存储数据比int大
    while (*str == ' ')  //跳过第一次出现的字符前的空格
    {
        str++;
    }
    if (  !(*str >= '0' && *str <= '9') && (*str!='-')&&(*str!='+')  )//如果第一个字符不是数字,也不是正负号,直接返回0
        return 0;
    if (*str == '-')     //如果第一个字符是负号,说明是负数
    {
        flag = -1;//flag赋值为-1
        str++;  //移动到符号,的下一位
        if (*str >= '0' && *str <= '9')//如果符号位后面紧跟是数字,正常进行
        {
            ret = 0;
            while (*str >= '0' && *str <= '9')
            {
                ret = ret * 10 + (*str - '0');// 字符的数字减 '0' ,就得到了这个字符代表的数字
                str++;
            }
            if (*str == '\0') //如果str到了'\0'就是合法转化,否则是非法
                sign = 1;
            ret *= flag;// 将结果乘上符号标识
            if (ret < INT_MIN)  //如果比INT_MIN还要小,就只能返回INT_MIN
                ret = INT_MIN;   
            return (int)ret ;  //强制类型转换
        }
        else    //如果符号位后面紧跟不是数字,就返回0,
           return 0;
    } 


    else     //如果第一个字符是负号,说明是负数
    {
        flag = 1; 
        if(*str=='+')  
        str++;    //如果有+ ,就移动到符号的下一位,没有+号,就不要
        if (*str >= '0' && *str <= '9')//如果符号位后面紧跟是数字,正常进行
        {
            ret = 0;
            while (*str >= '0' && *str <= '9') 
            {
                ret = ret * 10 + (*str - '0');//字符数字减 '0' ,就得到了数字
                str++;  //移到下一位
            }
            if (*str == '\0')  //如果str到了'\0'就是合法转化,否则是非法
                sign = 1;
            ret *= flag;
            if (ret > INT_MAX)   //如果比INT_MAX还要大,就只能返回INT_MAX
                ret = INT_MAX;
            return (int)ret; //强制类型转换
        }
        else                //如果符号位后面紧跟不是数字,就返回0,
            return 0;
    }
}

int main()
{
    char arr[20] = "  245  ";
    int ret = My_atoi(arr);
    if (sign == 1)
        printf("合法转换:%d\n", ret);
    else
        printf("非法转换:%d\n", ret);
    return 0;
}

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值