将长整数(十进制)转换为基数为 36 的字符串(C 中的 strtol 反转函数)

Bre*_*men 5 c base64 strtol

我可以使用该strtol函数将基于 base36 的值(另存为字符串)转换为long int

long int val = strtol("ABCZX123", 0, 36);
Run Code Online (Sandbox Code Playgroud)

是否有标准函数允许反转它?也就是把一个long intval变量转换成base36字符串,再获取"ABCZX123"

P__*_*J__ 6

没有这方面的标准函数。您需要编写自己的一个。

使用示例: https: //godbolt.org/z/MhRcNA

const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

char *reverse(char *str)
{
    char *end = str;
    char *start = str;

    if(!str || !*str) return str;
    while(*(end + 1)) end++;
    while(end > start)
    {
        int ch = *end;
        *end-- = *start;
        *start++ = ch;
    }
    return str;
}

char *tostring(char *buff, long long num, int base)
{
    int sign = num < 0;
    char *savedbuff = buff;

    if(base < 2 || base >= sizeof(digits)) return NULL;
    if(buff)
    {
        do
        {   
            *buff++ = digits[abs(num % base)];
            num /= base;
        }while(num);
        if(sign)
        {
            *buff++ = '-';
        }
        *buff = 0;
        reverse(savedbuff);
    }
    return savedbuff;
}
Run Code Online (Sandbox Code Playgroud)

  • 由于您已经有一个指向缓冲区末尾的指针,因此将其传递给“reverse()”而不是让它重新查找末尾会更有效。 (3认同)
  • 由于空终止符,`base &gt; sizeof(digits)` 不正确。此实现的最大基数为 62。另请注意,对于大于 36 的基数,它生成的输出与“strtol”不兼容。 (2认同)