写代码实现atoi函数
这道题看起来很简单,如果实现基本功能,大概10行以内就可以搞定。比如下面代码:
int atoi(char* str)
{
int number = 0;
while (*str != 0)
{
number = number * 10 + *str - '0';
++str;
}
return number;
}
但是上面的代码漏洞百出。上述的代码在遇到特殊情况时,就会产生不靠谱的结果,比如:
1、空指针
2、正负号
3、溢出
4、非法字符
所以,考虑全面的正确代码如下:
#include<stdio.h>
long long strToInt(const char* str, bool minus);
int Atoi(const char* str)
{
long long num = 0;//给一个比较大的数据类型,方便处理溢出
if (str != nullptr && *str != '\0')//判断指针是否为空,以及是否有有效字符
{
bool minus = false;//是否为负数
if (*str == '+')
{
++str;
}
else if (*str == '-')
{
++str;
minus = true;
}
if (*str != '\0')
{
num = strToInt(str, minus);
}
}
return (int)num;
}
long long strToInt(const char* str, bool minus)
{
long long num = 0;
while (*str != '\0')
{
if (*str >= '0' && *str <= '9')//判断是否为有效字符
{
int flag = minus ? -1 : 1;//判断正负数
num = num * 10 + flag * (long long(*str) - long long('0'));
if ((!minus && num > 0x7fffffff) || (minus && num < (signed int)0x80000000))
//判断是否溢出,包括正溢出和负溢出
{
num = 0;
break;
}
++str;
}
else
{
num = 0;
break;
}
}
return num;
}
int main()
{
const char* str = "-1234";
printf("%d\n", Atoi(str));
return 0;
}