天天看點

[算法練習]實作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[i] = *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[0]=='-' ?--sign:( str[0]=='+'?++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[MAX_PATH] = {0};
	int isNeg = num;
	if(isNeg<0)
		num = -num;

	int i = 0;
	do
	{
		str[i++] = num % 10 + '0';
		num = num / 10;
	} while (num>0);

	if(isNeg<0)
		str[i++] = '-';

	str[i] = '\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;
}
           

繼續閱讀