2011-08-28 63 views
2

我需要將無符號的64位整數轉換爲字符串。這是在基地36,或字符0-Z。 ulltoa在Linux手冊頁中不存在。但是sprintf可以。我如何使用sprintf來達到預期的效果?即什麼格式化%的東西?模擬ulltoa()的基數/ 36基數

或者如果snprintf不起作用,那麼我該怎麼做?

+0

可能重複[sprintf爲unsigned _int64](http://stackoverflow.com/questions/5140871/sprintf-for-unsigned-int64) – 2011-08-28 01:31:49

+0

@Code這是特別基地36,我不認爲這是一個重複。 –

+2

不要以爲你可以使用sprintf來做到這一點 – fpmurphy1

回答

4

您可以隨時編寫自己的轉換函數。下面的想法是從通過嚴重this fine answer啓發被盜:

char * int2base36(unsigned int n, char * buf, size_t buflen) 
{ 
    static const char digits[] = "ABCDEFGHI..."; 

    if (buflen < 1) return NULL; // buffer too small! 

    char * b = buf + buflen; 
    *--b = 0; 

    do { 
    if (b == buf) return NULL; // buffer too small! 

    *--b = digits[n % 36]; 
    n /= 36; 
    } while(n); 

    return b; 
} 

這將返回一個指向包含n的base36-表示,擺在你提供一個緩衝空結束的字符串。用法:

char buf[100]; 
std::cout << int2base36(37, buf, 100); 

如果你想和你是單線程的,也可以使字符緩衝區靜 - 我猜你可以找出一個合適的最大長度:中

char * int2base36_not_threadsafe(unsigned int n) 
{ 
    static char buf[128]; 
    static const size_t buflen = 128; 

    // rest as above 
+1

這假設緩衝區在開始處充滿了NULL。如果你有一個大小爲32的緩衝區,並且你使用這個函數並且打印緩衝區並且緩衝區沒有充滿空值,它將打印緩衝區的大小(但不是更多)。 –

+1

此函數還接受'unsigned int',它不是(我假設)在32位系統上的64位。應該是'unsigned long long'吧? –

+0

非常好,非常漂亮。 –