int my_atoi(char* str)
{
assert(str);
int flag = 1;
if (*str == '\0')
return 0;
while (isspace(*str))
str++;
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
long long ret = 0;
while (*str != '\0')
{
if (isdigit(*str))
{
ret = ret * 10 + flag * (*str - '0');
if (ret<INT_MIN || ret>INT_MAX)
return 0;
}
else
return (int)ret;
str++;
}
return (int)ret;
}
代码思路:首先使用断言判断传入地址是否为NULL,接着判断是否传入空字符串,如果是则直接返回0,否则继续执行。之后使用一个循环,这个循环是为了丢弃字符前的空字符。然后判断是否有正负号,如果是负号将flag值赋为-1,flag值计算最终值要使用到。后面遍历字符串直至末尾,如果是数字字符就减去字符0的ascii值将其转为数值并且将高位数字乘以相应的权值(权值纯属个人理解,表达可能不是那么准确,能体会到意思就行)算出最终值返回,如果最终值超出int类型的范围就返回0。在判断过正负号之后遇到数字以外的字符直接返回最终值,比如"aas"遇到第一个非空白字符不是数字字符就直接返回最终值0,如果遇到类似"12233a"就会返回12233的值。