atoi, itoa 字符串转换函数源代码

来源:互联网 发布:多态zpn mac 编辑:程序博客网 时间:2024/06/06 03:05
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 */}