atoi, itoa 字符串轉換函數源代碼

atoi 源代碼
int isspace(int x)  
{  
    if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r')  
        return 1;  
    else   
        return 0;  
}  
  
int isdigit(int x)  
{  
    if(x<='9'&&x>='0')           
        return 1;   
    else   
        return 0;  
}
  
int atoi(const char *nptr)  
{  
        int c;              /* current char */  
        int total;         /* current total */  
        int sign;           /* if '-', then negative, otherwise positive */  
  
  
        /* skip whitespace */  
        while ( isspace((int)(unsigned char)*nptr) )  
            ++nptr;  
  
 
        c = (int)(unsigned char)*nptr++;  
        sign = c;           /* save sign indication */  
        if (c == '-' || c == '+')  
           c = (int)(unsigned char)*nptr++;    /* skip sign */  
  
  
        total = 0;  
        while (isdigit(c)) {  
            total = 10 * total + (c - '0');     /* accumulate digit */  
            c = (int)(unsigned char)*nptr++;    /* get next char */  
        }  
  
  
       if (sign == '-')  
           return -total;  
        else  
            return total;   /* return result, negated if necessary */  
}


 

itoa
char * __cdecl _itoa (int val, char *buf, int radix)
{
        if (radix == 10 && val < 0)
            xtoa((unsigned long)val, buf, radix, 1);
        else
            xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
        return buf;
}

static void __cdecl xtoa (unsigned long val, char *buf, unsigned radix, int is_neg)
{
        char *p;                /* pointer to traverse string */
        char *firstdig;         /* pointer to first digit */
        char temp;              /* temp char */
        unsigned digval;        /* value of digit */

        p = buf;

        if (is_neg)            /* negative, so output '-' and negate */
        {  
			*p++ = '-';
            val  = (unsigned long)(-(long)val);
        }

        firstdig = p;           /* save pointer to first digit */

        do
		{
            digval = (unsigned) (val % radix);
            val    /= radix;       /* get next digit */

            /* convert to ascii and store */
            if (digval > 9)
                *p++ = (char) (digval - 10 + 'a');  /* a letter */
            else
                *p++ = (char) (digval + '0');       /* a digit */
        } while (val > 0);

        /* We now have the digit of the number in the buffer, but in reverse
           order.  Thus we reverse them now. */

        *p-- = '\0';            /* terminate string; p points to last digit */

        do 
		{
            temp = *p;
            *p = *firstdig;
            *firstdig = temp;   /* swap *p and *firstdig */
            --p;
            ++firstdig;         /* advance to next two digits */
        } while (firstdig < p); /* repeat until halfway */
}


 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章