需要考虑以下几点:
1 指针是否为空
2 字符串是否为空字符串
3 字符串是否有正负号
4 字符串转换的数字是否会整数溢出
5 设置全局变量,验证返回0是因为字符串为“0”还是因为错误输入
enum status {kvalid = 0, kInvalid};//全局变量,用于验证返回0是因为字符串为"0"还是错误输入
int flag = kvalid;
int StrToInt(const char *str)
{
flag = kInvalid;
long long num = 0;
if(str != NULL && *str != '\0')//判断指针是否为空以及字符串是否为空字符串
{
bool minus = false;//标志位,标志是否为负数
if(*str == '+')
str++;
else if(*str == '-')
{
str++;
minus = true;
}
if(*str != '\0')
{
num = StrToIntCore(str,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))//正整数最大值是0X7FFFFFFF,负整数最小值是0X80000000
{
num = 0;
break;
}
}
else
{
num = 0;
break;
}
}
if(*digit == '\0')
flag = kvalid;
return num;
}
本文详细解析了如何将字符串安全地转换为整数,并通过枚举状态和全局变量来区分有效的数字0与其他错误输入。
6506

被折叠的 条评论
为什么被折叠?



