atoi超强解析

函数说明:

库内自带函数,需要引用头文件#include<stdlib.h>

将字符串123转换成整型数字123(一百二十三)

特点:

  1. 输入123输出->123 //直接转换
  2. 输入123.5输出->123 //int类型转换(也可以理解为直接把.看作字符处理)
  3. 输入-123输出->-123 //需识别字符‘-’,转换成-(负号)
  4. 输入+123输出->123
  5. 输入   (空格)123输出->123 //如有空格,直接前移覆盖空格
  6. 输入12  (空格)3输出->12 //后面有空格就已停止,无法继续识别
  7. 输入-+123输出->0 //针对两个及以上+-符号无法识别
  8. 输入--123输出->0
  9. 输入123abcd123输出->123
  10. 输入123--++123输出->123

思想(分布求解):

1,输入123输出->123

1,得到字符个数以及单个字符转换为数字对应位数上的数字

字符个数与数字位数关系:1234  -4个字符-4是千位10的3次方

得到字符个数的方法:判断字符在’0’,’9’之间,定义count进行累加和

数字的位数即为10的count-1次方

2,实现单个字符的转换:

通过ASCCI码‘1’-‘0’=1;

eg: 0:ASCCI 48  1:ASCCI 49

部分代码实现:

int GetBite(char* arr, int length)

{

        int count = 0;

        int len;

        for (int i = 0; i < len; i++)

        {

                if (arr[i] >= '0' && arr[i] <= '9')

                {

                        count++;

                }

        }

        return count;

}

int my_atoi(char* arr, int len)

{

        assert(arr != NULL);

        int result = 0;

        int bite = GetBite(arr, len);

        for (int i = 0; i < len; i++)

        {

                result = (arr[i] - '0') * pow(10, bite - 1); //代码解释①

        }

        return result;

}

①result=(arr[i]-'0')*pow(10,bite-1);

pow(10,bite-1): pow函数是实现10的bite-1次方

arr[i]-'0':将字符转换为数字

2,输入123.5输出->123 //int类型转换(也可以理解为直接把.看作字符处理)

修改代码:

result = (arr[i] - '0') * pow(10, bite - 1);//代码解释②

②(int):进行类型强制转换,result为int类型,pow为double类型,int*double=double,需要强转

3,输入-123输出->-123 //需识别字符‘-’,转换成-(负号)

修改代码:

int flag = 1;//存储正负号

for (int i = 0; i < len; i++) //将整数变成正负数

{

        if (arr[i] == '-')

                flag = -1;

        else //加else的目的:如果不加else,-'-'-'0'不是字符,执行错误

                result = (int)(result + (arr[i] - '0') * poe(10, bite - 1));

}

4,输入+123输出->123

修改代码:

int flag = 1;//存储正负号

for (int i = 0; i < len; i++) //将整数变成正负数

{

        if (arr[i] == '-')

                flag = -1;

        else if (str[i] == '+') {

                continue;// 结束当前循环,进行新一轮循环

        else //加else的目的:如果不加else,-'-'-'0'不是字符,执行错误

                result = (int)(result + (arr[i] - '0') * poe(10, bite - 1));

}

5,输入   (空格)123输出->123 //如有空格,直接前移覆盖空格

修改代码:

while (arr[i] == ' ')//(*arr)

        arr[i] = arr[i++];//arr++;

6,输入12  (空格)3输出->12 //后面有空格就已停止,无法继续识别

修改代码:

GetBite函数内:

for (int i = 0; i < len; i++)

        {

                if (arr[i] >= '0' && arr[i] <= '9')

                {

                        count++;

                }

                else

                        break; //遇到空格直接返回

}

7,输入 - +123输出->0 //针对两个及以上+-符号无法识别

8,输入--123输出->0

//(7)(8)同理,代码如下:

GetBite函数内:

//用num来控制+-个数

int num = 0;

for (int i = 0; i < len; i++)

{

        if (arr[i] >= '0' && arr[i] <= '9')

        {

                count++;

                if (num >= 2)//如果出现两个及以上+-结果为0

                        return 0;

        }

                else if (arr[i] == '+' || arr[i] == '-') //得到+-的个数

                        num++;

                else

                        break; //遇到空格直接返回

}

9,输入123abcd123输出->123

10,输入123--++123输出->123

//与(6)同理

综合整理代码如下:

#define _CRT_SECURE_NO_WARNINGS //VS编译器下需要

#include<assert.h> //断言

#include<stdio.h>

#include<string.h>

#include<stdlib.h> // atoi   itoa

#include<math.h>  //pow函数

int GetBite(char* arr, int length)

{

        int count = 0, num = 0;

        int len = strlen(str);

        //删除空格

        for (int i = 0; i < len; i++)

        {

        if (arr[i] >= '0' && arr[i] <= '9')

        {

                count++;

                if (num >= 2)//如果出现两个及以上+-结果为0

                return 0;

          }

                else if (arr[i] == '+' || arr[i] == '-') //得到+-的个数

                        num++;

                else

                        break;

        }

        return count;

}



int my_atoi(char* arr, int len)

{

        assert(arr != NULL);

        int result = 0;

        int flag = 1;//存储正负号

        int i = 0;

        while (arr[i] == ' ')//(*arr)

        arr[i] = arr[i++];//arr++;

        int bite = GetBite(arr, len);

        int len = strlen(arr);//重新求长度

        for (int i = 0; i < len; i++) //将整数变成正负数

        {

                if (arr[i] == '-')

                        flag = -1;

                else if (arr[i] == '+')

                        continue;//结束了当前循环

                else //加else的目的:负数-'0'不是字符,执行错误

                        result = (int)(result + (arr[i] - '0') * pow(10, bite - 1));

        }

        return result * flag;

}



int main()

{

        char arr[] = "123";

        int length = sizeof(arr) / sizeof(arr[0]);

        printf("%d", my_atoi(arr, length));

        return 0;

}

如有错误麻烦评论区告诉我 谢谢❤

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值