目录
一、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;
}