您的位置:首页 > 职场人生

自己实现atoi和atof

2011-10-31 11:13 405 查看
面试题中经常出现的题目,将一个数字的字符串转换成整数。

需要注意的几个问题:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试