String to Integer (atoi)

来源:互联网 发布:靠谱助手软件 编辑:程序博客网 时间:2024/04/19 04:41

如果用long long来保存scan过程中的中间结果,代码如下:

class Solution {public:    int atoi(const char *str)    {        long long sum = 0;        int sign = 1;        const int len = strlen(str);        int idx = 0;                while(str[idx] == ' ') idx++; //略过前面的连续空格                if(str[idx] == '+')        {            sign = 1;            idx++;        }        else if(str[idx] == '-')        {            sign = -1;            idx++;        }                for(; idx<len; idx++)        {            int digit = str[idx]-'0';            if(digit >= 0 && digit <= 9)                sum = (sum*10 + digit);            else                break;        }                if(sum > INT_MAX)  //处理溢出情况            return (sign==1)? INT_MAX: INT_MIN;            return sum*sign;    }};

如果不允许用long long,则可以用一下方式处理溢出:

        for(; idx<len; idx++)        {            int digit = str[idx]-'0';            if(digit >= 0 && digit <= 9)            {                if(sum > INT_MAX/10 || sum == INT_MAX/10 && digit > INT_MAX%10) //处理溢出情况                    return (sign==1)? INT_MAX: INT_MIN;                                sum = (sum*10 + digit);            }            else                break;        }                /*        if(sum > INT_MAX)  //处理溢出情况            return (sign==1)? INT_MAX: INT_MIN;        */

8.30最新代码:

class Solution {public:    int atoi(const char *str) {        bool positive = true;        int value = 0;                int cur = 0;        while(str[cur] == ' ')            cur++;                if(str[cur] == '-')        {            positive = false;            cur++;        }        else if(str[cur] == '+')        {            positive = true;            cur++;        }        else if(str[cur] >= '0' && str[cur] <= '9')        {            positive = true;        }        else            return 0;                while(str[cur] >= '0' && str[cur] <= '9')        {            if(INT_MAX/10 < value || (INT_MAX/10==value && INT_MAX%10 < (str[cur]-'0')))            {                return positive?INT_MAX:INT_MIN;            }            value = value*10 + (str[cur]-'0');            cur++;        }        return positive?value:(0-value);            }};

0 0