附上itoa microsoft 版本代码, 只能转换2-36进制 (36限制是因为 0-9 a-z 一共36个字符,大于36的话只能用乱码表示了)
TCHAR * __cdecl _itox (
int val,
TCHAR *buf,
int radix
)
{
if (radix == 10 && val < 0)
xtox((unsigned long)val, buf, radix, 1); //如果是十进制负数另外处理显示
else
xtox((unsigned long)(unsigned int)val, buf, radix, 0); //其余按内存实际存放转换
return buf;
}
//带宏_SECURE_ITOA表示安全版本
#ifdef _SECURE_ITOA
static errno_t __stdcall xtox_s
(
unsigned long val,
TCHAR *buf,
size_t sizeInTChars,
unsigned radix,
int is_neg
)
#else /* _SECURE_ITOA */
static void __stdcall xtox
(
unsigned long val,
TCHAR *buf,
unsigned radix,
int is_neg
)
#endif /* _SECURE_ITOA */
{
TCHAR *p; /* pointer to traverse string */
TCHAR *firstdig; /* pointer to first digit */
TCHAR temp; /* temp char */
unsigned digval; /* value of digit */
#ifdef _SECURE_ITOA
size_t length; /* current length of the string */
/* validation section */
_VALIDATE_RETURN_ERRCODE(buf != NULL, EINVAL);
_VALIDATE_RETURN_ERRCODE(sizeInTChars > 0, EINVAL);
_RESET_STRING(buf, sizeInTChars);
_VALIDATE_RETURN_ERRCODE(sizeInTChars > (size_t)(is_neg ? 2 : 1), ERANGE);
_VALIDATE_RETURN_ERRCODE(2 <= radix && radix <= 36, EINVAL);
length = 0;
#endif /* _SECURE_ITOA */
p = buf;
if (is_neg) {
/* negative, so output '-' and negate */
*p++ = _T('-');
#ifdef _SECURE_ITOA
length++;
#endif /* _SECURE_ITOA */
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++ = (TCHAR) (digval - 10 + _T('a')); /* a letter */
else
*p++ = (TCHAR) (digval + _T('0')); /* a digit */
#ifndef _SECURE_ITOA
} while (val > 0);
#else /* _SECURE_ITOA */
length++;
} while (val > 0 && length < sizeInTChars);
/* Check for buffer overrun */
if (length >= sizeInTChars)
{
buf[0] = '\0';
_VALIDATE_RETURN_ERRCODE(length < sizeInTChars, ERANGE);
}
#endif /* _SECURE_ITOA */
/* We now have the digit of the number in the buffer, but in reverse
order. Thus we reverse them now. */
*p-- = _T('\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 */
#ifdef _SECURE_ITOA
return 0;
#endif /* _SECURE_ITOA */
}