关闭

atoi函数的实现

标签: atoi函数
234人阅读 评论(0) 收藏 举报
分类:

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:82404次
    • 积分:1860
    • 等级:
    • 排名:千里之外
    • 原创:98篇
    • 转载:55篇
    • 译文:0篇
    • 评论:4条