atoi函数的实现

<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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值