<span style="font-family: Arial, Helvetica, sans-serif;">atoi库函数是在求职面试中常被问到的一个题,我想这是考虑一个程序员对一个问题分析是否全面的一种测试吧。</span>
正确实现atoi函数需要考虑的如下几个问题:
首先是字符串里的字符有效性问题,有效的字符为 0-9以及可能首字母出现-或+的标识
其次是溢出问题
最后还有一个是对错误的处理,看某些实现,是通过指定一个全局变量,来指定错误的类型。下面是参考一些实现,自己写的实现程序,记录下来。
代码如下:
#include <iostream>
using namespace std;
enum Status{kValid = 0, kInvalid};
int g_value = kInvalid;
/**************************************************************************************
* 函数名 : str2IntCore
* 函数功能描述: 实现将字符转换成对应十进制数
* 输入参数 :
* str待转换的字符串
* flag ture标识str代表一个负数,false代表一个正数
* 返回值 : 返回0 需要考虑g_value的值,看是否是出错了,否则为str对应的十进制数值
****************************************************************************************/
long long str2IntCore(const char* str, bool flag){
int value = 1;
int idx = 0;
long long sum = 0;
char tmp;
int i = 0;
if(flag)
value = -1;
while(*(str+i) != '\0'){
tmp = *(str+i);
if(tmp > '9' || tmp < '0'){
return 0;
}
sum = (sum*10) + (tmp - '0');
if((!flag && sum >= 0x7fffffff) //溢出判断
|| (flag && sum <(signed int) 0x80000000)){
return 0;
}
i++;
}
if(*(str+i) == '\0')
g_value = kValid;
return sum*value;
}
/**************************************************************************************
* 函数名 : str2Int
* 函数功能描述: 对str做异常及正负判断
* 输入参数 :
* str待转换的字符串
* 返回值 : 返回0 需要考虑g_value的值,看是否是出错了,否则为str对应的十进制数值
****************************************************************************************/
int str2Int(const char* str){
bool flag = false;
int value = 0;
int i = 0;
if(NULL == str)
return 0;
if('+' == *str){
flag = false;
i++;
}
else if('-' == *str){
i++;
flag = true;
}
value = (int)str2IntCore(str+i, flag);
return value;
}
int main(){
char *str = "120394";
int value = str2Int(str);
cout<<"value is: "<< value <<endl;
cin.get();
return 0;
}