C语言 My_Atoi函数、My_Itoa函数

发布于:2023-01-25 ⋅ 阅读:(861) ⋅ 点赞:(0)

目录

一、My_Atoi函数

二、My_Itoa函数


一、My_Atoi函数

 myatoi atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数

算法的要求:

1.读入字符串并丢弃无用的前导空格。

2.检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。确定最终结果是负数还是正数。如果两者都不存在,则假定结果为正。加入一点就是负负得正,对多个负号进行处理。

3.读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。

4.将前面步骤读入的这些数字转换为整数(即,"123" ->123,"0032"-> 32)。如果没有读入数字,则整数为0。必要时更改符号(从步骤2开始)。

5.如果整数数超过32位有符号整数范围[-2^31,2^31 -1],需要截断这个整数,使其保持在这个范围内。具体来说,小于-2^31的整数应该被固定为-2^31,大于2^31 -1的整数应该被固定为2^31 - 1。

 6.返回整数作为最终结果。

代码如下:

#include<stdio.h>
int Myatoi(const char *s)
{
    int i = 0;
    long rev = 0;
    int flag = 1; //1为正数,-1为负数
    while(s[i] == ' ')
    {
        i++;
    }

    while(s[i] =='+' || s[i] == '-') //“+”的ASCLL值为43,“-”的ASCLL值为45
    {
        flag = flag * (44 - s[i]); //10进位ASCLL值44代表“,”
        i++;
    }
    while(s[i] >= '0' && s[i] <= '9')
    {
        if(rev > 214748364) //溢出问题 如果是214748365 下面rev*10操作时就会溢出
        {
            if(flag == -1)
            {
                return -2147483648;
            }
            else
            {
                return 2147483647;
            }
        }
        if(rev > 214748364) //溢出问题
        {
            if(flag == -1 && s[i] - '0' > 7)
            {
                return -2147483648;
            }
            else if(flag == 1 && s[i] - '0' > 7)
            {
                return 2147483647;
            }      
        }
         rev = rev * 10 + (s[i++] - '0');
    }
    if(flag == -1)
    {
        return -rev;
    }
     return rev;
}
int main()
{
    char arr[100] = "  -------++++-------++++++++-+-+-+------00111123ad   456 ";
    int m = Myatoi(arr);
    printf("%d",m);
    return 0;
}

运行结果为:

-111123

二、My_Itoa函数

上文中已经提到my_atoi函数中,atoi表示将字符串转为整型数。那么在这里,Itoa的意思即为将整型数转为字符串。 

char *__cdecl itoa(int _Val,char *_DstBuf,int _Radix)

int _Val:欲转换的数据。
char *_DstBuf:目标字符串的地址。
int _Radix:转换后的进制数,可以2进制、10进制、16进制等。
 

#include<stdio.h>
#include<assert.h>
char* My_itoa(int value, char* buff, int radix)
{
    assert(buff != NULL);
    int left = 0;
    int index = 0;
    int flag = 0;
    const char* arr = "0123456789abcdefghijklmnopqrstuvwxyz";
    if(value < 0 && radix == 10)
    {
        buff[index++] = '-';
        value *= -1;
        flag = 1;
    }
    unsigned int unsigned_value = (unsigned int)value; //将value从有符号类型转为无符号类型
    while (unsigned_value != 0)
    {
        left = unsigned_value % radix;//将余数存放到buff合适位置
        buff[index++] = arr[left];
        unsigned_value /= radix;
    }
    for(int j = 0; j < (index+1)/2; j++)
    {
        int temp = buff[j + flag];
        buff[j + flag] = buff[index - j -1];
        buff[index - j -1] = temp;
    }
    return buff;
}
int main()
{
    char buff[100] = {0};
    printf("%s\n",My_itoa(-1,buff,2));
    return 0;
}