今天重构代码时整理出的代码,支持有无符号整形,长整型,10/16进制转换
函数部分:
char *itoa(long long num, char *str, int radix, bool is_signed, int strwidth = 0)
{
char index[]="0123456789abcdef";
unsigned long long unum;
int i = 0;
int j = 0;
int k = 0;
if(radix == 10 && num < 0 && is_signed)
{
unum=(unsigned long long )-num;
str[i++]='-';
}
else {
unum=(unsigned long long )num; /* 其他情况 */
}
if (radix == 16)
{
str[0] = '0';
str[1] = 'x';
i += 2;
}
do
{
str[i++]=index[unum%(unsigned)radix];
unum /= radix;
}while(unum);
while(i < strwidth) str[i++] = '0'; // 前面补0
str[i]='\0';
/* 因为获取的字符是逆序的,需要调换顺序 */
if(str[0] == '-') {
k = 1; /* 十进制负数 */
}
else {
k = 0;
}
if (radix == 16)
{
k += 2;
}
char temp;
char* p = &str[k];
i = i - k;
for(j = 0; j < i / 2; j++){
temp = p[j];
p[j] = p[i - j - 1];
p[i - j - 1] = temp;
}
return str;
}
调用部分:
int main()
{
char * strRet;
strRet = new char[1000];
int num, radix, _signed;
while(1)
{
printf("请输入一个数字: ");
cin >> num;
printf("请输入转换的进制(10/16): ");
cin >> radix;
printf("是否带符号?(1/0): ");
cin >> _signed;
if(num == 0)
{
break;
}
strRet = myitoa_inner(num, strRet, radix, _signed);
cout< }
}
结果展示:
该接口不支持 输出 num < 0 且 radix ==16 的情况!
因为 没有 -0x...的改法