将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数(数值为0或者字符串不是一个合法的数值则返回0)。

输入描述 :输入一个字符串, 包括数字字母符号, 可以为空
输出描述 :如果是合法的数值表达则返回该数字,否则返回0

输入例子 :
+2147483647
1a33

输出例子 :
2147483647
0

分析:这个题刚拿到手的时候,有点懵。如果只是简单地将字符串“1234”输出成整数“1234”就完了的话,这个题就没有必要出了。认真想想,它考的是整个是对运行输入案例的包括性。所以,我们应该尽可能地考虑每一个可能发生的情况:
1.正负数的输出
2.含有字母字符
3.考虑数字过大或过小导致的溢出现象
4.字符串前面含有空格

class Solution {
    typedef enum STATE     //设置一个枚举类型来判别输入是否非法
    {
     VALID,
     INVALID
    }STATE;

   STATE state = VALID;       //先将状态置为合法
public:
    int StrToInt(string str) {
    int flag = 1;         //设置符号标志
    long long ret = 0;   //考虑到返回值可能较大,定义为long long
   const char* strch=str.c_str();    

    while(isspace(*strch))    //如果含有空格,指针就向后走
    {
        strch++;
    }

    if (*strch == '+')    //如果是正数,不用处理
        strch++;
    if (*strch == '-')    //如果是负数,将符号标志取反
    {
        flag = -flag;
        strch++;
    }

    while(*strch)
    {
        if (isdigit(*strch))     //判断是否为数字
        {
            ret = ret * 10 + (*strch - '0')*flag;
            if ((ret > INT_MAX) || (ret < INT_MIN))  //考虑溢出
            {
                ret = 0;
                break;
            }
            strch++;
        }

        else    //不是合法的数值
        {
            state = INVALID;    //将状态置为非法
            ret=0;              //返回0
            break;
        }     
    }
    return (int)ret;
  }
};

总结:我们在模拟实现库函数时,并不能做到所有功能的实现,库函数在很多细节的处理上考虑得更全面。在《剑指offer》中,这是个面试题,面试者只顾埋着头写代码,写出来的当然不能使面试官满意。如果是在面试,一定要和面试官进行沟通交流,看面试官希望我们怎么去处理这些细节。这就好比让你实现一个需求,而你自己都不清楚需求到底是怎么回事,这怎么可能写出来让人满意的产品。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值