需要注意的地方:
1 需要设置全局变量,用于判断函数返回的0是因为输入错误还是真正需要返回的
2 判断字符串地址是不是空
3 判断字符串是不是空字符串
4 判断字符串有没有正负号
5 判断字符串是不是只有正负号
6 判断转换后的整数会不会超出整数范围
7 判断除第一位正负号(如果有的话)以外有没有不是0~9的字符
enum status {valid=0,invalid};//全局变量,用于判断返回0是因为输入错误返回0还是真正地要返回0值
int g_status = invalid;
int strtoint(const char *str)
{
g_status = invalid;
long long num = 0;
if(str!=NULL && *str!='\0')//判断字符串是不是有效以及字符串是不是空字符串
{
bool minus = false;//负数标识位
if(*str == '+')//如果第一位是正号,则跳过
str++;
else if(*str == '-')//如果第一位是负号,则负号标识位设成true
{
str++;
minus = true;
}
if(*str!='\0')//防止出现只有正负号的情况
{
num = strtoint_core(str,minus);
}
}
return (int)num;
}
long long strtoint_core(const char *str, bool minus)
{
int flag = minus ? -1 : 1;//判断是整数还是负数
long long num = 0;//long long类型,防止数值范围超过整型范围,下面会有判断
while(*str != '\0')
{
if(*str >= '0' && *str <= '9')
{
num = num * 10 + flag * (*str - '\0');
if((!minus && num > 0x7FFFFFFF) || (minus && num < 0x80000000))//判断是不是超出了整型范围
{
num = 0;
break;
}
str++;
}
else//出现了0~9之外的其他字符
{
num = 0;
break;
}
}
if(*str == '\0')//只有在字符串全部正确扫描一遍后才将标识位设成valid
g_status = valid;
return num;
}