模拟实现atoi
分析: 需要对特殊情况进行处理。
字符转整数
1. 考虑输入的字符串是否为NULL、空字符串
2. 考虑输入的字符串是否包含正负号
3. 考虑输入的字符串是否会发生上溢或下溢(正整数的值是0X7FFFFFFF,最小的负整数是0X80000000)
4. 如何区分正常返回数字0和不合法的返回
//模拟实现 atoi
//int atoi( const char *string );
//需要考虑情况5种:1.空指针 2.空字符串 3.空白字符 4.正负号 5.溢出(正负)
enum Status
{
VALID,//合法
INVALID//非法
}; //检测状态值,只有一种情况为合法,其他均为非法,所以最开始最好初始化为非法
enum Status status = INVALID;
int my_atoi(const char* str)
{
int flag = 1;//标记正负数
long long ret = 0;//要判断是否溢出,若定义为int则永远也不可能溢出
assert(str);//1.空指针
if(*str == '\0')//2.空字符串
{
return 0;
}
//3.空白字符
while(isspace(*str))
{
str++;
}
//4.+-
if(*str == '+')
{
str++;
}
if(*str == '-')
{
flag = -1;
str++;
}
//正常字符
while(*str)
{
if(isdigit(*str))//1234a5 输出1234
{
ret = ret * 10 + flag*(*str - '0');
if(ret > INT_MAX || ret < INT_MIN )
{
if(flag == 1)
{
return INT_MAX ;
}
else
{
return INT_MIN ;
}
}
}
else
{
return ret;
}
str++;
}
status = VALID;
return (int)ret;
}
模拟实现 itoa
itoa的模拟实现
该函数的功能是将base进制的整型转化为相应字符串
value: 要转化为字符串的整型 str: 用存储转换的字符串
base: 用于表示作为字符串的值的数值基数,介于2和36之间,其中10表示十进制,16进制。。
char* itoa(int value, char* str, int base)
{
char* dest = str; //用来记录字符串的开始
stack<char> tmp;
if(value == 0)//value为0时的特殊处理
{
*str++ = '0';
*str = '\0';
return dest;
}
//base的范围为:[2-36]
if(base < 2 || base > 36)
{
*str = '\0';
return str;
}
int num = 1;
while(num)
{
num = value/base;
int data = value%base; //base从低到高位
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;
}