//要求:
//①求正负
//②上界溢出则返回上界,下界溢出则返回下界
//③遇到非数字(不包含+,-),则返回在该字符出现之前计算出的整数
//④能够跳过前面的空白字符
int atoi(const char *str)
{
long long num = 0;//绝对值,为了发现溢出,使用比返回类型int(4字节)更长的类型long long(8字节)
int sign = 1;//符号
int result = 0;//结果
long long temp; //暂存结果
const int min = (int)0x80000000;//下界
const int max = 2147483647;//上界
while (*str == '\t' || *str == ' ')//跳过前面的空白字符
{
++str;
}
if (*str == 0) //str为空字符串,那么将返回 0
{
goto Over;
}
if (*str == '-' || *str == '+')//判断正负
{
if (*str == '-')
sign = -1;
++str;
}
for (; *str != 0; ++str)//计算获数值
{
if (*str >= '0'&&*str <= '9')
{
num = num * 10 + (*str - '0');
}
else
{
break;//非数字则截断
}
}
temp = num * sign;
result = temp;
if (temp > max)//判断是否上界溢出
{
result = max;
goto Over;
}
if (temp < min)//判断是否下界溢出
{
result = min;
goto Over;
}
Over:
return result;
}