atoi和itoa的模拟实现

1.atoi函数:

函数原型:

int atoi (const char * str);

该函数的功能是将字符串转化为整型。分以下几种情况:

1)如果该字符串的最开始是 -,并且后面加的是数字,那么转化的整数是负整数。

2)如果该字符串的最开始是+ 或者是数字,那么转化的是正整数。

3)如果最开始是-/+ 加其他字符,就是不合法的,直接返回0.

4)考虑溢出,正溢出和负溢出。

模拟实现:

//atoi的模拟实现
int my_atoi(const char* str)
{
	//long long num = 0; //用来处理溢出问题
	int num = 0;
	int flag = 1; //标志位
	if(*str == '+' || *str == '-')
	{
		if(*str == '-')
			flag = -flag;
		*str++;
	}
	//当字符串开始有空格或tab的时候,往后走。
	while(isspace(*str))
		str++;

	while(*str)
	{
		if(*str > '9' || *str < '0')
			break;
		num = num*10 + (*str - '0');
 		str++;
	}

	//考虑是否溢出
	//此时的num没有符号位,若出现负数,必出现了溢出
	//flag == 1时,num为负,就是正溢。2147483648存不下,就会变为负数。
	//flag == -1时,num为负,就是负溢,此时发生溢出,num存不下,对于负数而言,就会变大。
	//比如:-2147483649,flag==-1,此时的str="2147483649",存不下,在内存中就成了-2147483646,会变大。
	if(num < 0)
	{
		if(flag == 1)
		{
			printf("发生正溢出");
			return 0;
		}
		else if(num > (signed int)0x80000000)
		{
			printf("发生负溢出");
			return 0;
		}
	}

	//另外一种判断溢出的方法:
      //此时num 的类型要为long long ,否则无法判断
	//if(((num > 0x7fffffff) && (flag == 1))
	//	|| ((num*flag < (signed int)0x80000000) && (flag == -1)))
	//{
	//	printf("有溢出");
	//	return 0;
	//}

	return num*flag;
}

int main()
{
	printf("模拟实现atoi:\n");
	printf("my_atoi(12345): %d\n",my_atoi("12345"));
	printf("my_atoi(-12345): %d\n",my_atoi("-12345"));
	printf("my_atoi(abc12345): %d\n",my_atoi("abc12345"));
	printf("my_atoi(-abc12345): %d\n",my_atoi("-abc12345"));
	printf("my_atoi(	12345): %d\n",my_atoi("		12345"));
	printf("my_atoi(2147483648): %d\n",my_atoi("2147483648")); //正溢出
	printf("my_atoi(-2147483649): %d\n",my_atoi("-2147483649")); //负溢出
	printf("my_atoi(-2147483648):%d\n",my_atoi("-2147483648"));

	return 0;

}

2.itoa函数:

函数原型:

char *  itoa ( int value, char * str, int base );

该函数的功能是将base进制的整型转化为相应字符串。

value:要转换为字符串的整型

str:用于存储转换来的字符串

base:用于表示作为字符串的值的数值基数,介于2和36之间,其中10表示十进制基,16进制,8八进制和2二进制

//itoa的模拟实现

char* my_itoa(int value,char* str,int base)
{
	char* dest = str; //用来记录字符串的开始
	std::stack<char> tmp;
	if(value == 0)
	{
		*str++ = '0';
		*str = '\0';
		return dest;
	}

	//base的范围为:[2-36],36进制就是:0-9 && a-z
	if(base < 2 || base > 36)
	{
		*str = '\0';
		return str;
	}
	int num = 1;
	while(num)
	{
		num = value / base; 
		int data = value % base; //data是从低位到高位
		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;
}

int main()
{
	char str[20];
	printf("my_itoa(0,str,10): %s\n",my_itoa(0,str,10));
	printf("my_itoa(12,str,10): %s\n",my_itoa(12,str,10));
	printf("my_itoa(20,str,2): %s\n",my_itoa(20,str,2));
	printf("my_itoa(67,str,8): %s\n",my_itoa(67,str,8));
	printf("my_itoa(78,str,16): %s\n",my_itoa(78,str,16));
	printf("my_itoa(45,str,32): %s\n",my_itoa(45,str,32));
	printf("my_itoa(90,str,39): %s\n",my_itoa(90,str,39));

	return 0;
}

(*^▽^*)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值