Leetccode 8. 字符串转整数 (C语言)

题目解析:

  1. 判断第一个不为空的是数字还是字母还是正负号还是其他字符
  2. 若为数字,则将上一步记录的数值乘10加上本字符,向下查找下一个字符
  3. 若为字母或其他字符则 return 0
  4. 若为正负号则记录符号,向下查找下一个字符,跳入2或3
  5. 遍历完所有字符若数值溢出则根据正负号分别返回相应值

遇到的问题:

上述思路是我的第二个思路,其实第一个思路是想不用一步记录一次数值,利用指针记录符合条件的符号再利用 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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值