atoi的模拟实现

atoi的函数功能是将字符串转化为整形,它的函数原型如下:

int atoi( const char *string );

在这个函数中需要考虑以下几种情况:
1.是否存在非法字符。非法字符包括+,-,字母,字符,空格等等,如果是非法字符则直接跳过即可。
2.输入空串和输入一个字符串只有”0”的返回值都是0,如何区别?
可以设置一个全局变量,如果输入的是字符串”0”,则修改该全局变量的值,否则不做修改,最后可以通过判断该全局变量的值来确定是哪一种情况。
3.是否会溢出,我使用的是long long类型的,正数的话最大值不超过0x7FFFFFFF,负数的话不小于0x80000000,如果不满足题意则直接退出。
代码实现如下:

enum state
{
    Valid,
    Invalid,
};
bool stat=Valid;  //全局变量,标识是空串还是"0"
class Solution {
public:
    int StrToInt(const char *str) 
    {
        stat=Invalid;
        int num=0;
        const char *digit=str;
        if(str != NULL && *str != '\0')
        {
            int flag=1;  //符号位,是否存在+,-号
            if(*digit == '+') 
                digit++;
            else if(*digit == '-')
            {
                flag=-1;
                digit++;
            }
            while(*digit != '\0')
            {
                //是否存在非法字符
                if(*digit >= '0' && *digit <= '9')
                {
                    num=10*num+flag*(*digit-'0');
                    //溢出的情况
                    if((flag == 1) && (num > 0x7FFFFFFF) \
                        || (flag == -1) && (num < (size_t)0x80000000))
                    {
                        num=0;
                        break;
                    }
                    digit++;
                }
                else
                {//非法字符,可能是字母,空格
                    digit++;
                }
            }
            if(*digit == '\0')
            {
                stat=Valid;
            }
        }
        return num;
    }
};

测试用例:
1.char * str=”+abc12 34qwz5?6@7xyz”;
//0 1234567
2.char *str=”“;或者是char *str=”0”;
(1).空串
//1 0
(2).只有一个字符0
//0 0
3.char *str=”-123”;
//-123

你可能感兴趣的:(剑指offer刷题)