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