1.atoi函数:
函数原型:
int atoi (const char * str);
该函数的功能是将字符串转化为整型。分以下几种情况:
1)如果该字符串的最开始是 -,并且后面加的是数字,那么转化的整数是负整数。
2)如果该字符串的最开始是+ 或者是数字,那么转化的是正整数。
3)如果最开始是-/+ 加其他字符,就是不合法的,直接返回0.
4)考虑溢出,正溢出和负溢出。
模拟实现:
//atoi的模拟实现
int my_atoi(const char* str)
{
//long long num = 0; //用来处理溢出问题
int num = 0;
int flag = 1; //标志位
if(*str == '+' || *str == '-')
{
if(*str == '-')
flag = -flag;
*str++;
}
//当字符串开始有空格或tab的时候,往后走。
while(isspace(*str))
str++;
while(*str)
{
if(*str > '9' || *str < '0')
break;
num = num*10 + (*str - '0');
str++;
}
//考虑是否溢出
//此时的num没有符号位,若出现负数,必出现了溢出
//flag == 1时,num为负,就是正溢。2147483648存不下,就会变为负数。
//flag == -1时,num为负,就是负溢,此时发生溢出,num存不下,对于负数而言,就会变大。
//比如:-2147483649,flag==-1,此时的str="2147483649",存不下,在内存中就成了-2147483646,会变大。
if(num < 0)
{
if(flag == 1)
{
printf("发生正溢出");
return 0;
}
else if(num > (signed int)0x80000000)
{
printf("发生负溢出");
return 0;
}
}
//另外一种判断溢出的方法:
//此时num 的类型要为long long ,否则无法判断
//if(((num > 0x7fffffff) && (flag == 1))
// || ((num*flag < (signed int)0x80000000) && (flag == -1)))
//{
// printf("有溢出");
// return 0;
//}
return num*flag;
}
int main()
{
printf("模拟实现atoi:\n");
printf("my_atoi(12345): %d\n",my_atoi("12345"));
printf("my_atoi(-12345): %d\n",my_atoi("-12345"));
printf("my_atoi(abc12345): %d\n",my_atoi("abc12345"));
printf("my_atoi(-abc12345): %d\n",my_atoi("-abc12345"));
printf("my_atoi( 12345): %d\n",my_atoi(" 12345"));
printf("my_atoi(2147483648): %d\n",my_atoi("2147483648")); //正溢出
printf("my_atoi(-2147483649): %d\n",my_atoi("-2147483649")); //负溢出
printf("my_atoi(-2147483648):%d\n",my_atoi("-2147483648"));
return 0;
}
2.itoa函数:
函数原型:
char * itoa ( int value, char * str, int base );
该函数的功能是将base进制的整型转化为相应字符串。
value:要转换为字符串的整型
str:用于存储转换来的字符串
base:用于表示作为字符串的值的数值基数,介于2和36之间,其中10表示十进制基,16进制,8八进制和2二进制
//itoa的模拟实现
char* my_itoa(int value,char* str,int base)
{
char* dest = str; //用来记录字符串的开始
std::stack<char> tmp;
if(value == 0)
{
*str++ = '0';
*str = '\0';
return dest;
}
//base的范围为:[2-36],36进制就是:0-9 && a-z
if(base < 2 || base > 36)
{
*str = '\0';
return str;
}
int num = 1;
while(num)
{
num = value / base;
int data = value % base; //data是从低位到高位
if(data < 10)
tmp.push(data+'0');
else
tmp.push(data-10+'a'); //跳过大写字母
value = num;
}
while(!tmp.empty())
{
*str++ = tmp.top();
tmp.pop();
}
*str = '\0';
return dest;
}
int main()
{
char str[20];
printf("my_itoa(0,str,10): %s\n",my_itoa(0,str,10));
printf("my_itoa(12,str,10): %s\n",my_itoa(12,str,10));
printf("my_itoa(20,str,2): %s\n",my_itoa(20,str,2));
printf("my_itoa(67,str,8): %s\n",my_itoa(67,str,8));
printf("my_itoa(78,str,16): %s\n",my_itoa(78,str,16));
printf("my_itoa(45,str,32): %s\n",my_itoa(45,str,32));
printf("my_itoa(90,str,39): %s\n",my_itoa(90,str,39));
return 0;
}
(*^▽^*)