注意:
atoi通过区分一个全局变量来区分当字符串为空的时候返回的0和输入的字符串是“0”的时候返回值的0,如果是非法输入,返回0并把这个全局变量设为一个特殊的标记。如果输入是“0”,则返回0,不会设置全局变量。这样当atio的调用者得到返回值0的时候,可以通过检查全局变量得知输入究竟是非法输入还是字符串“0”所以在下面代码中,如果是正常的转换,输入都是合法的,那么会在最后将这个全局变量置为0,如果产生任何的不和法比如空串和‘\0’那么就会将他置为1
还有一些其他要注意的点都在代码中写了,详细见代码
enum Status{kValid = 0, kInvalid};
int g_nStatus = kValid;
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');
num = num * 10 + (*digit - '0'); //上面两行代码改成这行和下面判断minus的if语句,不然每次都重复执行上面两行代码没什么意思
//判断是否发生上溢出或者下溢出
if((!minus && num > 0x7FFFFFFF) || (minus && num < (signed int)0x80000000))
{
num = 0;
b