1.atoi函数要求
atoi() 函数用来将字符串转换成整数(int),其原型为:int atoi(const char * str);
(1) 此函数需要丢弃之前的空白字符,直到找到第一个非空白字符。之后从这个字符开始,选取一个可选的正号或者符号后面跟随尽可能多的数字,并将其解释为数字的值。
(2)字符串可以在形成整数的字符后包括多余的字符,将这些字符忽略,这些字符对于函数的行为没有影响。
(3)如果字符串中的第一个非空白的字符不是有效的整数,或者没有这样的序列存在,字符串为空或者只包含空白字符则不进行转换。
(4)如果不能执行有效的转换,则返回 0。如果正确的值超过的可表示的范围,则返回INT_MAX(2147483647)或 INT_MIN(-2147483648)。
2.atoi函授的模拟实现代码如下:
#define INT_MAX 2147483647
#define INT_MIN -2147483678
enum State
{
VALID, //合法状态
INVALID //非法状态
};
enum State state = INVALID;//因为非法状态的情况比较多,而合法的状态只有一种情况,为了使代码简单些,所以将开始状态初始化为非法状态
int my_atoi(const char* str)
{
long long ret = 0;
int flag = 1;//标识正负数
assert(str != NULL);//空指针
if (*str == '\0')//空字符串
{
return 0;
}
while (isspace(*str)) //空白字符
{
str++;
}
if (*str == '+')
{
str++;
}
else if (*str == '-')
{
str++;
flag = -1;
}
while (*str)
{
if (isdigit(*str))
{
ret = ret * 10 + (*str - '0')*flag;
if (ret > INT_MAX&&ret < INT_MIN)//越界情况
{
return 0;
}
}
else
{
state = VALID;//合法状态
return (int)ret;
}
str++;
}
state = VALID;
return (int)ret;
}
int main()
{
char *p = " 1122abcdef1122";
int ret = my_atoi(p);
if (state == VALID)
printf("%d\n", ret);
system("pause");
return 0;
}