模拟实现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 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;
}

 

你可能感兴趣的:(C)