1. 程式人生 > >atoi函式的實現

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