该题主要考虑特殊情况:
-
- 非法输入——比如"1+2"
-
- 空字符串与’0’——二者的返回值均为0,需要一个全局变量来区分非法输入(空字符串属于非法输入)
-
- 数字溢出——最大正整数为0x7FFFFFFF,最小负整数为0x80000000,如果溢出,返回0,并标记为非法输入。
// 把字符串转换为整数
// 空字符串返回值为0,输入为'0'时,返回值也为0,因此需要全局变量来区分
enum status {VALID = 0, INVLID};
int g_status = VALID;
long long strToIntCore(const char* str, bool sign) {
long long num = 0;
while(*str != '\0') {
int flag = sign ? -1 : 1;
if(*str >= '0' && *str <= '9') {
num = num * 10 + flag * (*str - '0');
//考虑数字溢出,最大正整数为0x7FFFFFFF,最小负整数为0x80000000,计算机处理最小负整数时,当作原码进行处理,因此,需要在0x80000000前面进行强制类型转换
if((!sign && num > 0x7FFFFFFF) || (sign && num < (signed int)0x80000000)) {
num = 0;
break;
} else {
str++;
}
} else {
num = 0;
break;
}
}
// 如果是合法输入,最后的字符是'\0'
if (*str == '\0') {
g_status = VALID;
}
return num;
}
int strToInt(const char* str) {
long long num = 0;
// 考虑指针为空和字符串为空的情况
if (str != nullptr && *str != '\0') {
bool sign = false;
if (*str == '+') {
str++;
} else if (*str == '-')
{
str++;
sign = true;
}
if (*str != '\0') {
num = strToIntCore(str, sign);
}
}
return int(num);
}
int main() {
char* str = "-234";
int res;
res = strToInt(str);
std::cout << res;
}