sprintf for unsigned _int64

c, c++, format-specifiers, long-long, uint64

Solution

I don't know what POSIX has to say about this, but this is nicely handled by core C99:

#include <stdio.h>
#include <inttypes.h>

int main(void) {
    uint64_t dbFileSize = 99;
    uint64_t fileSize = 100;
    char buf[128];
    memset(buf, 0x00, 128);
    sprintf( buf, "\nOD DB File Size = %" PRIu64 " bytes \t"
                  " XML file size = %" PRIu64 " bytes\n"
                  , fileSize, dbFileSize );
    printf( "The string is %s\n", buf );
}

If your compiler isn't C99 compliant, get a different compiler. (Yes, I'm looking at you, Visual Studio.)

PS: If you are worried about portability, don't use `%lld`. That's for `long long`, but there are no guarantees that `long long` actually is the same as `_int64` (POSIX) or `int64_t` (C99).

Edit: Mea culpa - I more or less brainlessly "search & replace"d the `_int64` with `int64_t` without really looking at what I am doing. Thanks for the comments pointing out that it's `uint64_t`, not `unsigned int64_t`. Corrected.

Problem

I am having following code. output of second %d in sprintf is always shown as zero. I think i am specifying wrong specifiers. Can any one help me in getting write string with right values. And this has to achieved in posix standard. Thanks for inputs ``` void main() { unsigned _int64 dbFileSize = 99; unsigned _int64 fileSize = 100; char buf[128]; memset(buf, 0x00, 128); sprintf(buf, "\nOD DB File Size = %d bytes \t XML file size = %d bytes", fileSize, dbFileSize); printf("The string is %s ", buf); } ``` Output: ``` The string is OD DB File Size = 100 bytes XML file size = 0 bytes ```

Original source

Related problems