atoi函数的作用是将字符串变量转换为整形变量。
在实现之前我们创建一个枚举类型,来记录目标字符串的特殊类型,空串、全为空格和全为0的情况。
enum State {
EMPTY,
ALLZERO,
ALLSPACE,
};//创建枚举便于分辨类型
int State = EMPTY;
int myatoi(const char* arr)
{
if (*arr == '\0')//判断是否为空串
return 0;
char* ptr = (char*)arr;
while (isspace(*ptr))
ptr++;
if (*ptr == '\0')//判断是否全为空格
{
State = ALLSPACE;
return 0;
}
while(*ptr == '0')
ptr++;
if (*ptr == '\0')//判断是否全为0
{
State = ALLZERO;
return 0;
}
int flag = 1;
if (*ptr == '-')//判断正负
{
ptr++;
flag = -1;
}
else if (*ptr == '+')
{
ptr++;
}
int num = 0;
while (*ptr != '\0')
{
if (isdigit(*ptr))
{
num = num * 10 + flag*(*ptr - '0');
if ((flag == 1 && num >= 0x7FFFFFFF) && (flag == -1 && num <= 0x80000000))//判断是否溢出
{
return 0;
}
}
ptr++;
}
return num;
}
itoa函数的作用则与atoi相反,它是将整型变量转换为字符串变量。
void myitoa(int num, char* str)
{
char* left = str;
int flag = 1;
if (num < 0)
{
flag = -1;
}
while (num)
{
*str = num % 10 + '0';
str++;
num /= 10;
}
if (flag < 0)
{
*str = '-';
str++;
}
*str == '\0';
char* right = str - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}