这里的代码使用的函数调函数的形式实现的,代码如下:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
static int to_Hex(const char* str)//16进制转10进制
{
//0123456789abcdefABCDEF
int sum = 0;
while (isxdigit(*str))//判断此时str的第一位是否为数字(这里需要注意的是因为在前边的函数里已经判断过该数字是16进制的数字所以此时的str里已经没有"0x"或"0X")
{
if (isdigit(*str))//如果是数字直接乘以16
{
sum = sum * 16 + *str - '0';
}
else//否则就是字母这里我们不管大写还是小写都变成小写
{
tolower(*str);
sum = sum * 16 + *str - 'a' + 10;
}
str++;
}
return sum;
}
static int to_Oct(const char* str)//8进制转10进制
{
//01234567
int sum = 0;
while (isdigit(*str) && *str != '8' && *str != '9')
{
sum = sum * 8 + *str - '0';
str++;
}
return sum;
}
static int to_Dec(const char* str)//10十进制
{
//0123456789
int sum = 0;
while (isdigit(*str))
{
sum = sum * 10 + *str - '0';
str++;
}
return sum;
}
int My_atoi(const char* str)
{
assert(str != NULL); //安全处理机制
if (NULL == str)
{
return INT_MAX;
}
int tmp = 1;//正负标记
int sum = 0;
while (isspace(*str))//遇到空格往后走1,把空格遍历完
{
str++;
}
if (*str == '-')//若有'-',则最终输出的结果中就加'-'
{
tmp = -tmp;
str++;
}
if (*str == '+')//若有'+',则最终输出的结果中直接输出
{
str++;
}
if (*str == '0')//可以是8进制也可以是16进制
{
if (*(str + 1) == 'x' || *(str + 1) == 'X') //为16进制数
{
sum = to_Hex(str + 2);
}
else //为8进制数
{
sum = to_Oct(str + 1);
}
}
else //十进制数
{
sum = to_Dec(str);
}
return sum * tmp;
}
int main()
{
const char *str1 = " -0x2b";
int tmp1 = My_atoi(str1);
printf("%d\n", tmp1);
const char *str2 = " +0100";
int tmp2 = My_atoi(str2);
printf("%d\n", tmp2);
const char* str3 = " 281a";
int tmp3 = My_atoi(str3);
printf("%d\n", tmp3);
}
调试结果如下: