把整型转换为字符串的转换函数,请高手赐教
求一个把整型转换为字符串的转换函数,请高手赐教!
如题,我想要一个把整型(int)转换成字符串(string)的实现函数,具体的函数原型希望如下:
char* itoa( int value, char *str, int radix );
参数说明:value —— 是待转换的整型
*str —— 是转换之后要返回的字符串
radix —— 是转换的基数,即可以用这个规定转换的基数
其实,也有不少网友有相关的代码,但是有的和标准的参数设置不同,有的是代码太过繁琐,函数种使用了很多原本不需要的参数,使代码显得很难懂。
我现在想要一个简洁、易懂的实现函数,希望高手多多指教!
最后,说句谢谢!
------解决方案--------------------
忘记考虑符号了
char* itoa( int value, char *str, int radix )
{
int i=0, v;
char buffer[128];
char *p, *q;
int sign = value < 0 ? 1 : 0;
q = str;
if (radix > 16) return 0;
do {
v = value % radix ;
if (v> =10)
buffer[i] = 'A ' + v-10;
else
buffer[i] = '0 ' + v;
value /= radix;
i++;
} while (value)
buffer[i] = '\0 ';
p = buffer + strlen(buffer) - 1;
if (sign) *q++ = '- ';
while(p> =buffer) *q++ = *p--;
return str;
}
------解决方案--------------------
长的是长了点,主要是其他进制的负数处理。。。
char *itoa(int value, char *string, int radix)
{
int i = 0, j = 0, flag = 1, tmp, tmp1, tmp2;
char *temp = string;
if (value < 0)
{
flag = 1;
if (radix == 10)
{
*string = '- ';
j++;
value = abs(value);
}
else
{
value = (~(abs(value))+1) & 0x7FFFFFFF; //设置符号位为 0
}
}
while (value != 0)
{
tmp = value % radix;
value /= radix;
if (tmp > = 10)
{
tmp = (tmp - 10) + 'A ';
}
else
{
tmp = tmp + '0 ';
}
*((string++) + j) = (char)tmp;
}
string = temp;
tmp2 = (int)strlen(string) - 1;
tmp = tmp2 / 2;
for (i=0; i <tmp; i++)
{
tmp1 = *(string+i+j);
*(string+i+j) = *(string+tmp2-i);
*(string+tmp2-i) = (char)tmp1;
}
if (flag == 1)
{
//负数,置最高位为 1
switch(radix)
{
case 16:
tmp = ((*string - '0 ') + 8);
if(tmp > 10)
{
*string = (char)((tmp - 10) + 'A ');
}
else
{
*string = (char)(tmp + '0 ');
}
break;
case 8:
*string = (*string + 4);
break;
case 2:
*string = '1 ';
break;
case 10:
default:
break;
}
}
return temp;
}
如题,我想要一个把整型(int)转换成字符串(string)的实现函数,具体的函数原型希望如下:
char* itoa( int value, char *str, int radix );
参数说明:value —— 是待转换的整型
*str —— 是转换之后要返回的字符串
radix —— 是转换的基数,即可以用这个规定转换的基数
其实,也有不少网友有相关的代码,但是有的和标准的参数设置不同,有的是代码太过繁琐,函数种使用了很多原本不需要的参数,使代码显得很难懂。
我现在想要一个简洁、易懂的实现函数,希望高手多多指教!
最后,说句谢谢!
------解决方案--------------------
忘记考虑符号了
char* itoa( int value, char *str, int radix )
{
int i=0, v;
char buffer[128];
char *p, *q;
int sign = value < 0 ? 1 : 0;
q = str;
if (radix > 16) return 0;
do {
v = value % radix ;
if (v> =10)
buffer[i] = 'A ' + v-10;
else
buffer[i] = '0 ' + v;
value /= radix;
i++;
} while (value)
buffer[i] = '\0 ';
p = buffer + strlen(buffer) - 1;
if (sign) *q++ = '- ';
while(p> =buffer) *q++ = *p--;
return str;
}
------解决方案--------------------
长的是长了点,主要是其他进制的负数处理。。。
char *itoa(int value, char *string, int radix)
{
int i = 0, j = 0, flag = 1, tmp, tmp1, tmp2;
char *temp = string;
if (value < 0)
{
flag = 1;
if (radix == 10)
{
*string = '- ';
j++;
value = abs(value);
}
else
{
value = (~(abs(value))+1) & 0x7FFFFFFF; //设置符号位为 0
}
}
while (value != 0)
{
tmp = value % radix;
value /= radix;
if (tmp > = 10)
{
tmp = (tmp - 10) + 'A ';
}
else
{
tmp = tmp + '0 ';
}
*((string++) + j) = (char)tmp;
}
string = temp;
tmp2 = (int)strlen(string) - 1;
tmp = tmp2 / 2;
for (i=0; i <tmp; i++)
{
tmp1 = *(string+i+j);
*(string+i+j) = *(string+tmp2-i);
*(string+tmp2-i) = (char)tmp1;
}
if (flag == 1)
{
//负数,置最高位为 1
switch(radix)
{
case 16:
tmp = ((*string - '0 ') + 8);
if(tmp > 10)
{
*string = (char)((tmp - 10) + 'A ');
}
else
{
*string = (char)(tmp + '0 ');
}
break;
case 8:
*string = (*string + 4);
break;
case 2:
*string = '1 ';
break;
case 10:
default:
break;
}
}
return temp;
}