#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
//a to i
//库里面的 atoi函数 只能转换十进制
//字符串转整数
//八进制,当遇到非数字字符就退出
int o_atoi(const char *str)
{
int tmp = 0;
const char *ptr = str; //定义这个ptr是为了之后的符数输出“-”
if(*str == '-' || *str == '+') //为了避免正负号被错杀
{
*str++;
}
while(*str != '\0')
{
if(!isdigit(*str))
{
break;
}
else
{
tmp = tmp*8 + (*str-48);
*str++;
}
}
if(*ptr == '-')
{
tmp = -tmp; //此时又从首位开始解引用
}
return tmp;
}
//十进制,当遇到非数字字符就退出
int d_atoi(const char *str)
{
int tmp = 0;
const char *ptr = str; //定义这个ptr是为了之后的符数输出“-”
if(*str == '-' || *str == '+')
{
*str++;
}
while(*str != '\0')
{
if(!isdigit(*str))
{
break;
}
else
{
tmp = tmp*10 + (*str-48);
*str++;
}
}
if(*ptr == '-')
{
tmp = -tmp;
}
return tmp;
}
//十六进制,遇到非数字需要判断才可以退出
int x_atoi(const char *str)
{
int tmp = 0;
const char *ptr = str; //定义这个ptr是为了之后的符数输出“-”
if(*str == '-' || *str == '+')
{
*str++;
}
//字符串不为空且字符属于十六进制
while(*str != '\0' && isxdigit(*str))
{
if(isdigit(*str)) //如果是数字直接转换
{
tmp = tmp*16 + (*str-48);
}
else
{
char ch = toupper(*str); //把小写变成大写
tmp = tmp*16 + ch - 'A' + 10; //比如ch为B,字符b-字符a为1,再+10,即为十六进制的11
}
*str++;
}
if(*ptr == '-')
{
tmp = -tmp;
}
return tmp;
}
//后面的~36进制都可以此类推,改变while()中的字符判定条件即可。
int main()
{
char str1[100] = "-12";
char str2[100] = "12a3";
char str3[100] = "y12";
char str4[100] = "1a";
char str5[100] = "-12a3";
//对负数情况进行测试
unsigned int n1 = o_atoi(str1);
unsigned int n2 = d_atoi(str1);
unsigned int n3 = x_atoi(str1);
//对十六进制测试
unsigned int n4 = x_atoi(str4);
unsigned int n5 = x_atoi(str5);
unsigned int k1 = o_atoi(str2);
unsigned int k2 = d_atoi(str3);
unsigned int k3 = x_atoi(str1);
printf("%d\n",n1);
printf("%d\n",n2);
printf("%d\n",n3);
printf("%d\n",n4);
printf("%d\n",n5);
printf("%d\n",k2);
return 0;
}