当我看到这么一个问题时,我觉得是一个很简单的问题,立刻就会想到用一个while循环遍历整个字符串,将一个个字符转化为数字,关于这种问题已经不是第一次遇到了,所以自信满满的写好然后去网上寻找答案。

   这或许就是理想和现实的差距,把自己写的程序和标准答案一对,发现没有一个地方可以称之为写对。答案中提到了atoi函数,是一个把字符串转换为整数的库函数。

   下面就是具体的实现:

long long StrToIntCode(const char *ptr, bool minus)
{
    long long num = 0;
    while (*ptr != '\0')
    {
        if (*ptr >= '0' && *ptr <= '9')
        {
            int flag = minus ? -1 : 1;
            num = num * 10 + flag*(*ptr - '0');
            if ((!minus && num > 0x7FFFFFFF) \
                || (minus && num < (signed int)0x80000000))/*判断是否上溢出或者上溢出*/
            {
                num = 0;
                break;
            }
            ptr++;
        }
        else
        {
            num = 0;
            break;
        }
    }
    if (*ptr == '\0')
    {
        sign = v_normal;
    }
    return num;
}

int StrToInt(const char *ptr)
{
    sign = v_error;
    long long num = 0;
    if (ptr != NULL && *ptr != '\0')
    {
        bool minus = false;
        if (*ptr == '+')
        {
            ptr++;
        }
        else if (*ptr == '-')
        {
            ptr++;
            minus = true;
        }
        if (*ptr != '\0')
        {
            num = StrToIntCode(ptr, minus);
        }

    }
    return (int)num;
}

一开始进入StrToInt函数先判断字符串是否为空,若字符串为空,则直接返回非法输入。

enum state
{
    v_normal = 0,//正常
    v_error//非法
};

int sign = v_error;/*设置全局变量判断是否为非法输入*/

不为空并且第一个字符不为‘\0’,则分情况第一个字符为+或者-,则输出的时候为正数和负数。然后进入StrToIntCode函数将字符串转换为数字,在这里要考虑上溢出和下溢出。

            if ((!minus && num > 0x7FFFFFFF) \
                || (minus && num < (signed int)0x80000000))/*判断是否上溢出或者上溢出*/
            {
                num = 0;
                break;
            }