剑指 Offer 67. 把字符串转换成整数
int my_atoi(char *str)
{
//防止空指针
assert(str);
//开头若不为数字或正负号返回0
if (isdigit(*str) && *str != '+' && *str != '-')
{
return 0;
}
//定义保存结果的变量
long long result = 0;
//定义符号标志
int flag = 1;
//丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
while (isspace(*str))
{
*str++;
}
//当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,
// 作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
if (*str == '+')
{
flag = 1;
str++;
}
else if (*str == '-')
{
flag = -1;
str++;
}
//跳过连续的0(比如 -000000000000001 )
while (*str == '0')
{
*str++;
}
//记录结果位数
int count = 0;
//依次扫描,直到字符串结尾结束并且位数小于11(INT_MAX为10位)如果超过10位,则没有必要继续向后
while (*str != '\0' && count <11)
{
//如果不是数字类型字符,结束循环
if (!isdigit(*str))
{
break;
}
//如果是为数字类型转字符,将其转换为数字
result = result * 10 + (*str - '0');
count++;
str++;
}
//判断越界
if (result > INT_MAX)
{
return INT_MAX;
}
if (result < INT_MIN)
{
return INT_MIN;
}
return flag*(int) result;
}
解析:
根据题意,有以下几种情况需要考虑:
-
首字符不为数字或正、负号:返回0即可;
-
开头空格字符:直接跳过;
-
**符号位:**三种情况,即 ‘’+’’ , ‘’-’’ , ''无符号" ;新建一个变量保存符号位,返回前将结果乘符号位即可;
-
非数字字符:遇到其非数字字符直接返回当前已计算的结果;
-
数字字符:
-
字符转数字: “此数字的 ASCII 码” 与‘0’ 的 ASCII 码” 相减即可;
-
数字拼接: 若从左向右遍历数字,设当前位字符为*str,当前结果为 res,新结果为 newRes,则数字拼接公式为:
newRes= res*10+ (*str - ‘0’)
-
-
数字越界处理
定义保存结果变量时使用 long long 保存,最后让结果与INT_MAX或INT_MIN相比较,返回相应的越界值即可;
if (result > INT_MAX) { return INT_MAX; } if (result < INT_MIN) { return INT_MIN; }