题目:
编写一个StrToInt函数实现atoi库函数的功能。参考的函数接口如下:
int StrToInt( char *string );
分析:
编写库函数时要充分考虑到各种情况,对于这道题,到考虑到一下几点:
1.传入的字符串是否为NULL或者空字符串。
2.传入的字符串是否为合法数字(存不存在其他非法字符)。
3.字符串中符号位的处理。
4.转换失败的标示。
5.字符串表示的数字是否超出表示范围(假设不超过)。
enum Status { kValid = 0, kInvalid };
int g_nStatus = kValid;
class Solution
{
public:
int StrToInt( string str )
{
char* cStr = const_cast<char*>(str.c_str());
long long num = 0;
if ( cStr != NULL && *cStr != '\0' )
{
bool minus = false;
if ( *cStr == '+' )
cStr++;
else if ( *cStr == '-' )
{
cStr++;
minus = true;
}
if ( *cStr != '\0' )
{
num = StrToIntCore( cStr, minus );
}
}
return (int)num;
}
long long StrToIntCore( const char* digit, bool minus )
{
long long num = 0;
while ( *digit != '\0' )
{
if ( *digit >= '0' && *digit <= '9' )
{
int flag = minus ? -1 : 1;
num = num * 10 + flag * ( *digit - '0' );
//判断数字是否超出范围
if ( (!minus && num > 0x7FFFFFFF) || (minus && num < (signed int)0x80000000) )
{
num = 0;
break;
}
digit++;
}
else
{
num = 0;
break;
}
}
if ( *digit == '\0' )
{
g_nStatus = kValid;
}
return num;
}
};