static int to_Hex(const char* str)//判断16进制
{
//0123456789abcdefABCDEF
int sum = 0;
while (isxdigit(*str))
{
if (isdigit(*str))
{
sum = sum * 16 + *str - '0';
}
else
{
tolower(*str);//全部转换成小写字母
sum = sum * 16 + *str - 'a' + 10;
}
str++;
}
return sum;
}
static int to_Oct(const char* str)//判断是否为八进制
{
//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
int tmp = 1;//正负标记
int sum = 0;
while (isspace(*str))
{
str++;
}
if (*str == '-')
{
tmp = -tmp;
str++;
}
if (*str == '+')
{
str++;
}
if (*str == '0')//首地址为0
{
if (*(str + 1) == 'x' || *(str + 1) == 'X')//第二个元素是否为X和x
{
sum = to_Hex(str + 2);//十六进制
}
else
{
sum = to_Oct(str + 1);//八进制
}
}
else
{
sum = to_Dec(str);//返回十进制
}
return sum * tmp;
}
int main()
{
const char *str1 = " -0x1a";
//const char *str2 = " -0123";
//const char* str3 = " 123a";
int tmp1 = My_atoi(str1);
printf("%d\n", tmp1);
return 0;
}
atoi:只能10进制
strtol:将字符串转换为长整型(任何进制)
第一个参数:字符串开始地址
第二个参数:二级指针,返回字符串解析时停下来的位置
第三个参数:X进制