5000564 发表于 2017-6-1 13:33:50

[算法练习]实现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]
查看完整版本: [算法练习]实现itoa,atoi