字符串转整型是一般是一件很简单的事情,用atoi()就可以实现,但是当考虑到一些特殊条件之后,比如输入无效字符,输入数据超出整型表示范围,输入空指针等情况时,atoi()的缺陷就暴露出来了。
特别是以下情况(开发环境:VS2019):
1、传入参数第一个字符为无效字符时,atoi()直接输出0,没有错误返回;
2、传入参数超出整型表示范围时,atoi()直接舍弃超出部分的数据,没有错误返回;
3、传入参数为空指针时,直接导致程序崩溃,这显然是灾难性的。
以上缺陷,有兴趣的小伙伴也可以自行验证。
以下代码主要是针对这几个问题进行改进,测试结果符合预期,如果还有什么漏洞,欢迎大家指出。
字符串转整型代码:
int StrToInt(char* str)
{
int num = 0;
if (str) //判断是否空指针
{
if ((*str >= '0' && *str <= '9') | (*str == '-')) //string在0-9或者负号之内
{
if (*str == '-') //负数
{
str++;
while ((*str != 0)) //未到达字符串结尾
{
if ((*str >= '0' && *str <= '9')) //防止中间有非0-9字符
{
num = num * 10 + *str - '0';
str++;
if ((num > 0x7fffffff) || (num > 0x80000000))
return -2; //溢出
}
else return -1; //非法输入
}
num = -num;
}
else
{
while (*str != 0)
{
if ((*str >= '0' && *str <= '9'))
{
num = num * 10 + *str - '0';
str++;
if (!(num >= 0) && (num <= 0x7fffffff)) return -2; //溢出
}
else return -1;
}
}
}
else return -1;
}
else
return -1; //非法输入
return num;
}
main函数测试代码:
int main()
{
int res = 0;
res = StrToInt("2147483647");
if (res == -1)
printf("无效输入!\n");
else if (res == -2)
printf("数据溢出!\n");
else
printf("%d\n",res);
return 0;
}
测试结果1:正数溢出
测试结果2:负数溢出
测试结果3:输入无效字符
测试结果4:空指针