自己实现atoi和atof

面试题中经常出现的题目,将一个数字的字符串转换成整数。

需要注意的几个问题:

1,开头是:“+”,或者“-”。

2,进制的考虑,以“0x”开头的是16进制,以“0”开头的是8进制。计算方法: number = number*radix + ret;

3,溢出的考虑,最大正整数: 0x7FFFFFFF,最大负整数:0X8000000。溢出的判断, if(ret<MAX_INT/radix || ret==MAX_INT&&ret<=MAX_INT%radix)

补充一些关于整数溢出的问题,当对最大的正整数+1时,其将变为最大的负整数。之后继续执行++操作时,负整数将不断地变大,再变回为最大的正整数。如此循环。

利用这个原理可以应付如下面试题,不使用任何减法操作,实现如下函数:f(x),返回值是:x-1。

方法就是,引入辅助变量i=1,之后不断地对i和x执行++操作,知道i变为0。

代码如下:

int f(int x)
{
    int i = 1,j = x;
    for (;i;++i,++j);
    return j;
}

atoi的代码如下:

int myAtoI(char* str)
{
	int radix = 10;
	char *ptr = str;
	bool flag = false;
	int number = 0;
	int digival = 0;
	int maxval = 0;
	while(isspace(*ptr))
		ptr++;

	if(*ptr=='+') ptr++;
	if(*ptr=='-') 
	{
		flag = true; 
		ptr++;
	}

	if(*ptr=='0')
	{
		radix = 8;
		if((*(ptr+1)=='x'||*(ptr+1)=='X'))
		{
			radix = 16;
			ptr++;	
		}
		ptr++;
	}

	maxval =  INT_MAX/radix;
	while(*ptr)
	{
		if(isdigit(*ptr))
			digival = *ptr - '0';
		else
			if(isalpha(*ptr))
				digival = toupper(*ptr) - 'A' + 10;
			else
				break;
		if(number<maxval||number==maxval&&digival<=INT_MAX%radix)
			number = radix*number + digival;
		else
		{
			//overflow
			if(flag)
				return (-INT_MIN);
			else
				return INT_MAX;
		}
		ptr++;
		
	}
	if(flag)
		return (-number);
	else
		return number;
}

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

cenlu99

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值