模擬實現atoi 和itoa

模擬實現atoi

分析: 需要對特殊情況進行處理。

字符轉整數
1. 考慮輸入的字符串是否爲NULL、空字符串
2. 考慮輸入的字符串是否包含正負號
3. 考慮輸入的字符串是否會發生上溢或下溢(正整數的值是0X7FFFFFFF,最小的負整數是0X80000000)
4. 如何區分正常返回數字0和不合法的返回
 

//模擬實現 atoi
//int atoi( const char *string );
//需要考慮情況5種:1.空指針 2.空字符串 3.空白字符 4.正負號 5.溢出(正負)

enum Status
{
	VALID,//合法
	INVALID//非法
}; //檢測狀態值,只有一種情況爲合法,其他均爲非法,所以最開始最好初始化爲非法

enum Status status = INVALID;
int my_atoi(const char* str)
{
	int flag = 1;//標記正負數
	long long ret = 0;//要判斷是否溢出,若定義爲int則永遠也不可能溢出
	assert(str);//1.空指針

	if(*str == '\0')//2.空字符串
	{
		return 0;
	}
	//3.空白字符
	while(isspace(*str))
	{
		str++;
	}
	//4.+-
	if(*str == '+')
	{
		str++;
	}
	if(*str == '-')
	{
		flag = -1;
		str++;
	}
	//正常字符
	while(*str)
	{
		if(isdigit(*str))//1234a5 輸出1234
		{
			ret = ret  * 10 + flag*(*str - '0');
			if(ret > INT_MAX || ret < INT_MIN )
			{
				if(flag == 1)
				{
					return INT_MAX ;
				}
				else
				{
					return INT_MIN ;
				}
			}
		}
		else
		{
			return ret;
		}
		str++;
	}

	status = VALID;
	return (int)ret;
}

模擬實現 itoa

itoa的模擬實現
該函數的功能是將base進制的整型轉化爲相應字符串
value: 要轉化爲字符串的整型  str: 用存儲轉換的字符串
base: 用於表示作爲字符串的值的數值基數,介於2和36之間,其中10表示十進制,16進制。。

char* itoa(int value, char* str, int base)
{
	char* dest = str; //用來記錄字符串的開始
	stack<char> tmp;
	if(value == 0)//value爲0時的特殊處理
	{
		*str++ = '0';
		*str = '\0';
		return dest;
	}
	//base的範圍爲:[2-36]
	if(base < 2 || base > 36)
	{
		*str = '\0';
		return str;
	}

	int num = 1;
	while(num)
	{
		num = value/base;
		int data = value%base; //base從低到高位
		if(data < 10 )
		{
			tmp.push(data+'0');
		}
		else
		{
			tmp.push(data-10+'a'); //跳過大寫字母
		}
		value = num;
	}

	while(!tmp.empty())
	{
		*str++ = tmp.top();
		tmp.pop();
	}
	*str = '\0';
	return dest;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章