c++ 数字转 十六进制 或十进制 字符串

今天重构代码时整理出的代码,支持有无符号整形,长整型,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...的改法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值