1、C库的atoi的模拟实现
atoi的作用就是将字符串转为整形,它的接口函数是:
int atoi ( const char * str );
要模拟实现C库的atoi函数需要考虑以下几种特殊情况:
1>、空串,返回0
2>、是否存在空格,如果全部是空格呢?全部是空格,返回0
3>、是否存在符号位
4>、符号位之后是否是全0,返回0
5>、是否存在特殊字符,特殊字符指的是字母,字符,空格等(指出现在正确的数字之后的特殊字符)
6>、是否会溢出,溢出了如何解决?
7>、空串和全部是空格或者全部是0都返回的是正数0,如何区分这种情况呢?设置一个全局的变量,如果是不同的情况则设置成不同的值。
代码实现如下:
enum State
{
EMPTY,
ALLZERO,
ALLSPACE,
};
int state = EMPTY; //该全局变量是用来决定返回的0是哪一个情况
int Atoi(const string& str)
{
int num = 0;
if (str.empty()) //是空串
return 0;
char *pstr = (char *)str.c_str();
while (isspace(*pstr))//是否存在空格
{
++pstr;
}
if (*pstr == '\0') //全部是空格
{
state = ALLSPACE;
return 0;
}
//确定符号位
int flag = 1; //正数
if (*pstr == '-')
{
flag = -1;
pstr++;
}
else if (*pstr == '+')
{
pstr++;
}
while (*pstr == '0') //判断是否存在0
{
pstr++;
}
if (*pstr == '\0') //全部是字符0
{
state = ALLZERO;
return 0;
}
while (*pstr != '\0')
{
if (isdigit(*pstr)) //是数字
{
num = num * 10 + flag*(*pstr - '0');
if ((flag == 1 && num >= 0x7FFFFFFF) || (flag == -1 && num <= 0x80000000) ) //判断是否溢出
{
num = 0;
}
}
++pstr;
}
return num;
}
2、C库的itoa的模拟实现
itoa的作用就是将整形转为字符串,它的接口函数是:
char * itoa ( int value, char * str, int base );
需要考虑负数的情况
代码实现如下:
void Itoa(int num, char *str)
{
char *left = str;
int flag = num;
if (num < 0) //考虑到负数的情况
num = -num;
while (num > 0)
{
*str++ = num % 10 + '0';
num /= 10;
}
if (flag < 0)
{
*str++ = '-';
}
*str = '\0';
//此时是逆序存放的,需要翻转过来
char *right = str - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
++left;
--right;
}
}