[算法练习]实现itoa,atoi
int my_itoa(int val, char* buf){
char *p2;
unsigned int a; //every digit
int len;
char *p1; //start of the digit char
char temp;
unsigned int u;
if(buf==NULL)
{
return 0;
}
p2 = buf;
if (val < 0)
{
if(val == 0x80000000)
{
char *num = "-2147483648";
for(i=0;i<12;i++)
{
buf = *num++;
}
return 11;
}
*p2++ = '-';
val = 0 - val;
}
u = (unsigned int)val;
p1 = p2;
do
{
a = u % 10;
u /= 10;
*p2++ = a + '0';
} while (u > 0);
len = (int)(p2 - buf);
*p2-- = 0;
//swap
do
{
temp = *p2;
*p2 = *p1;
*p1 = temp;
--p2;
++p1;
} while (p1 < p2);
return len;
}
#define MAX ((int)0x7FFFFFFF)//整数最大32位都是1
#define MIN ((int)0x80000000)//最大+1就是最小
int my_atoi(const char * str)
{
bool negative=false;
unsigned long result=0;
if(str==NULL)
return 0;
while(*str==' ')
str++;
if(*str=='-')
{
negative=true;
str++;
}
else if(*str=='+')
str++;
if(*str<'0'||*str>'9')
return 0;
while(*str>='0' && *str<='9')
{
result=result*10+*str-'0';
//小于最小值 ||大于最大值
if((negative && result>MAX + 1) || (!negative &&result>MAX))
{
//溢出检测
return 0;
}
str++;
}
//负数处理
if(negative)
result *= -1;
return (int)result;
}
我自己实现的:
int aatoi(const char * str)
{
if(!str)return 0;
__int64 test=+0;
char sign=0 ;
if( ( str=='-' ?--sign:( str=='+'?++sign:sign++ ) ) )
str++;
while('0'<= *str && *str <= '9')
{
test = test*10 + (*str++ - '0');
if(test*sign> 2147483646) return 2147483647;
else if(test*sign< -2147483647) return -2147483648;
}
return int(test)*sign;
}
#define INT_MAX (2147483647)
#define INT_MIN (-2147483648)
int _atoi(const char *str)
{
if(NULL == str) return 0;
unsigned int result = 0;
int sign = 1;
if(*str == '-' || *str == '+')
{
if(*str == '-')
sign = -1;
str++;
}
while ('0' <= *str && *str <= '9')
{
unsigned int digit = *str - '0';
if((result >INT_MAX / 10) ||
(sign > 0 ? (result == INT_MAX / 10 && digit > INT_MAX %10)
:(result == ((unsigned int)INT_MAX + 1) / 10 && digit > (((unsigned int)(INT_MAX + 1) % 10)))))
{
return sign > 0 ? INT_MAX : INT_MIN;
}
result = result * 10 + digit;
str++;
}
return ((int)result) * sign;
}
char* _iota(int num)
{
static char str = {0};
int isNeg = num;
if(isNeg<0)
num = -num;
int i = 0;
do
{
str = num % 10 + '0';
num = num / 10;
} while (num>0);
if(isNeg<0)
str = '-';
str = '\0';
Reverse(str,_strlen(str));
return str;
}
void Reverse(char *str,int len)
{
if(NULL == str|| len <= 1)
return;
char strtemp = *str;
*str = *(str + len - 1);
*(str + len - 1) = strtemp;
Reverse(str+1,len-2);
}size_t _strlen(char *str)
{
<span style="white-space:pre"> </span>return (NULL == str || *str == '\0') ? 0 : _strlen(str+1) + 1;
}
页:
[1]