原题参见july大神博客系列【微软面试100题】
题目描述:输入一个表示整数的字符串,把该字符串转换成整数(int)并输出。
分析思路:(本题亦见于《剑指offer》面试题49)
核心部分的代码其实就是 num = num*10 + flag * (*str - '0');
但是本题还需要考虑到各种输入情况,比如正负号、空指针、空字符串以及溢出等方方面面。因此要尽量周到和完整
书中给出的参考代码如下:
enum Status { kValid = 0, kInvalid };
int g_nStatus = kValid; //全局变量用以区分有效和无效输入
//空指针、空字符串、含非数字字符串均为非法输入
int StrToInt(const char* str)
{
g_nStatus = kInvalid;
long long num = 0;
if(str != NULL && *str != '\0')
{
bool minus = false; //用来标识正负号
if(*str == '+')
str++;
else if(*str == '-')
{
minus = true;
str++;
}
if(*str != '\0')
num = StrToIntCore(str,minus);
}
return (int) num;
}
long long StrToIntCore(const char* str, bool minus)
{
long long num = 0;
int flag = minus ? -1:1;
while(*str != '\0')
{
if(*str >= 0' && *str <= '9')
{
num = num * 10 + flag * (*str - '0');
//判断溢出
if( (!minus) && num > 0x7FFFFFF || (minus && num < (int) 0x80000000))
{
num = 0;
break;
}
str++;
}
else
{
//输入含有非数字时,提前退出,并返回0,
num = 0;
break;
}
}
//正常遍历到字符串末位,将全局变量置为kValid,说明输出的值是有效的
if(*str == '\0')
g_nStatus = kValid;
return num;
}