说明
itoa()和atoi()是用来在整数数值和字符串(以'/0'结尾)之间转换的函数。
它们并不是标准C的一部分,但是也很常用,一般编译器都会支持。
itoa()函数的原型如下:
char* itoa(
int num,
char *str,
int radix
)
其中num表示需要转换的数值,str表示存放转换后的字符串的数组指针,radix表示不同的进制,可以是2,8,16等。返回值同str。
它的实现由很多种,下面一种实现:
char* itoa(int num, char *str, int radix)
{
/*索引表 */
char index[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
unsigned unum;/*中间变量*/
int i = 0, j, k;
/*确定unum的值*/
if (radix == 10 && num < 0)/*十进制负数*/
{
unum = (unsigned)-num;
str[i++] = '-';
}
else unum = (unsigned)num;/*其他情况*/
/*转换*/
do {
str[i++] = index[unum % (unsigned)radix];
unum /= radix;
} while (unum);
str[i] = '\0';
/*逆序*/
if (str[0] == '-')
k = 1;/*十进制负数*/
else
k = 0;
char temp;
for (j = k; j <= (i - 1) / 2; j++)
{
temp = str[j];
str[j] = str[i - 1 + k - j];
str[i - 1 + k - j] = temp;
}
return str;
}
atoi()函数的原型如下:
int atoi (
const char * str
);
其中str表示需要转换的字符串,返回的是对应的整数数值。
它的实现由很多种,下面一种实现:
int atoi(char* pstr) {
int intVal = 0; // 返回值
int sign = 1; // 符号, 正数为 1, 负数为 -1
// 判断指针是否为空 pstr == NULL
if (pstr == 0)
return 0;
// 跳过前面的空格字符 ' ' 的 ascii 值 0x20
while (' ' == *pstr)
pstr++;
// 判断正负号
if ('-' == *pstr)
sign = -1;
// 如果是符号, 指针后移
if ('-' == *pstr || '+' == *pstr)
pstr++;
while (*pstr >= '0' && *pstr <= '9') {
intVal = intVal * 10 + (((int)*pstr) - 0x30);
pstr++;
}
// 返回结果,int32 范围是: 2147483647 ~ -2147483648, 此处会进行溢出运算
return intVal * sign;
}
注意上述代码在处理字符串首字符不是ASCII数字也不是加减号时,返回的结果是0,还是有点问题的,但在这样的函数接口下似乎也没有好的办法。