首页 > 代码库 > 剑指offer (49) 字符串转数字

剑指offer (49) 字符串转数字

class Test {    public:        Test() : n2(0), n1(n2 + 2) { }    private:        int n1;        int n2;};

调用构造函数之后,n1个n2各为多少?

分析:构造函数的初始化顺序仅仅取决于成员变量的声明顺序,所以这是 应该是 n1先初始化,然后是n2初始化

当n1初始化值 = n2值 + 2,此时n2并没有初始化,n2为内置类型并且是non-static,所以n2此时为随机值

故 n1 为随机值,n1初始完之后,n2初始化为0

最终 n1为随机值,n2为0

 

字符串转为数字:

需要考虑以下几点:

1. 输入字符串指针为NULL,如果输入为NULL,则返回0,而输入为‘0‘时也返回0,所以应该设置一个全局变量来区分

2. 输入为空字符串

3. 正负号,并且字符串只有一个负号的问题: ‘-‘

4. 字符不是介于 ‘0‘ 至 ‘9‘ 之间

5. 溢出判断

long long StrToIntCore(const char* str, bool minus);enum Status {kValid = 0, kInvalid};int g_nStatus = kValid;int StrToInt(const char* str){    g_nStatus = kInvalid;    long long num = 0;    if(str != NULL && *str != \0)     {        bool minus = false;        if(*str == +)            str ++;        else if(*str == -)         {            str ++;            minus = true;        }        if(*str != \0)         {            num = StrToIntCore(str, minus);        }    }    return (int)num;}long long StrToIntCore(const char* digit, bool minus){    long long num = 0;    while(*digit != \0)     {        if(*digit >= 0 && *digit <= 9)         {            int flag = minus ? -1 : 1;            num = num * 10 + flag * (*digit - 0);            if((!minus && num > 0x7FFFFFFF)                 || (minus && num < (signed int)0x80000000))            {                num = 0;                break;            }            digit++;        }        else         {            num = 0;            break;        }    }    if(*digit == \0)     {        g_nStatus = kValid;    }    return num;}