题目解析:
- 判断第一个不为空的是数字还是字母还是正负号还是其他字符
- 若为数字,则将上一步记录的数值乘10加上本字符,向下查找下一个字符
- 若为字母或其他字符则 return 0
- 若为正负号则记录符号,向下查找下一个字符,跳入2或3
- 遍历完所有字符若数值溢出则根据正负号分别返回相应值
遇到的问题:
上述思路是我的第二个思路,其实第一个思路是想不用一步记录一次数值,利用指针记录符合条件的符号再利用 sscanf函数直接将字符串中的数值转换为整数。但是在判断溢出的时候遇到了问题,sscanf本身就只能把字符串中的数值转换为int型整数,如果字符串中的数溢出,sscanf也直接转换为溢出后对应的数值,因此判断溢出变得异常困难,调试了好几种均有测试用例通不过的情况。只好换思路,用long long int先记录数值,即使数值是溢出的,再进行判断。
代码:
#include <stdio.h>
#include <stdlib.h>
int myAtoi1(char* str) {
if(strlen(str)==0)
return 0;
char* xianzai= str;
long long fanhui = 0;
int flag = 1;//记录符号位正负
long long max = pow(2,31)-1;
long long min = pow(2,31);//溢出的上下界不相同
while (*xianzair == ' ')
{
xianzai++;//跳过空格位置
}
if (*xianzai == '-')
{
flag = -1;
xianzai++;
}
else if(*xianzai == '+')
{
xianzai++;
}
else if (*xianzai < '0' || *xianzai > '9')
{
return 0;
}
while (*xianzai >= '0' && *xianzai <= '9')
{
fanhui= fanhui*10;
fanhui=fanhui+*xianzai-'0';//利用符号本身的ascii码直接转换成数字
if(flag==1 && fanhui>max)
{
//正数溢出,返回INT_MAX
return max;
}
else if(flag==-1&&fanhui>min)
{
return min;//注意int类型上下界数值上相差1
}
xianzai++;
}
return flag*fanhui;
}
int main()
{
char *s= "-01 2a";
printf("%s\n",s);
int zifuchuan=0;
zifuchuan=myAtoi1(s);
printf("%d\n",zifuchuan);
return 0;
}