当我看到这么一个问题时,我觉得是一个很简单的问题,立刻就会想到用一个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;
}
转载于:https://blog.51cto.com/helloleex/1722067