实现atoi
作为一只程序猿,面试时经常会被要求实现atoi,快排这种看起来很简单,但是写对了却不容易的函数。今天试着写了一下atoi,记个笔记。
假设要实现的atoi函数原型是
int Atoi(const char* str);
以下几点必须要考虑到:
- 正常流程,即如何从一个常规字符串如“1234”得到整型1234
- str是否为空指针
- 处理str开头的空格,比如“ 10”这种字符串
- 考虑正负号,如“+23”,“-34”
- 考虑字符串中的非法字符,如“124a234"
- 考虑溢出,感觉这个最难
最后贴上我写的代码,欢迎指摘。
// test whether base*10 + offset will overflow,
// base is positive number and offset is between 0~9.
bool WillOverflow(int base, int offset, bool positive)
{
ASSERT (offset <=9 && offset >= 0);
if(base < 0)
return true;
if(base < INT_MAX/10)
return false;
if(base > INT_MAX/10)
return true;
if (positive)
{
return offset > 7;
}
else
{
return offset > 8;
}
}
int Atoi(const char *str)
{
//1.判断是否为空指针
if (str == 0)
return 0;
//2.开头的空格和0不考虑
while(*str == ' ' || *str == '0')
str ++;
int n = 0;
int s = 1;
for(const char *p=str; *p!=0; p++)
{
//3.考虑正负号
if(p == str)
{
if(*p == '+')
{
s = 1;
continue;
}
else if(*p == '-')
{
s = -1;
continue;
}
}
//4.考虑非法字符
if(*p>'9' || *p<'0')
return s * n;
//5.考虑溢出
if(WillOverflow(n, *p-'0', s==1))
{
if(s == 1)
return INT_MAX;
else
return INT_MIN;
}
//6.正常流程
n = n*10 + *p - '0';
}
return s * n;
}