当我看到这么一个问题时,我觉得是一个很简单的问题,立刻就会想到用一个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;            }