atoi函数是将字符串转化为数字,这个函数可以面对任何错误的情况,是个强大的函数。今天我们就来模拟下它。
(1)考虑指针为空的情况
assert(str != NULL);
(2)考虑字符串为空的状况
if (*str == '\0')
{
return state;
}
state 是定义的一个全局变量,用来判断是否合法,首先赋值为不合法。
(3)考虑字符串前面是空白字符的情况,可以用isspace函数判断,(充分利用库函数)。
while (str&&isspace(*str))
{
str++;
}
(4)考虑是负数的情况
if (*str == '-')
{
flag = -flag;
str++;
}
flag的初始化为1,而-flag则为-1,相当于正负系数。
(5)考虑字符串前面是数字后面是其他字符的情况
else//非法字符
{
state = LEGAL;
return (int)ret;
}
这时截断后面的其他字符,返回计算的整型值。
(6)最后就是正常的情况了,数字字符
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 +( (*str) - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN))
{
return state;
}
}
else//非法字符
{
state = LEGAL;
return (int)ret;
}
该考虑的情况已经考虑完成,接下来就是整体的代码了
#include <ctype.h>
#include <limits.h>
#if 1
enum LEGAL
{
LEGAL,
ILLEGAL
};
enum LEGAL state = ILLEGAL;
int my_atoi(char *str)
{
int flag = 1;
long long ret = 0;
//指针为空
assert(str != NULL);
//空字符串
if (*str == '\0')
{
return state;
}
//空白字符
while (str&&isspace(*str))
{
str++;
}
//负数
if (*str == '-')
{
flag = -flag;
str++;
}
//数字
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 +( (*str) - '0')*flag;
if ((ret > INT_MAX) || (ret < INT_MIN))
{
return state;
}
}
else//非法字符
{
state = LEGAL;
return (int)ret;
}
str++;
}
state = LEGAL;
return (int) ret;
}
int main()
{
char str[] = "-12222222";
int ret = my_atoi(str);
if (state == LEGAL)
printf("%d", ret);
else
printf("不合法!");
getchar();
return 0;
}
好了,今天的代码完成了,加油!