sprintf для неподписанного _int64 - PullRequest
16 голосов
/ 28 февраля 2011

У меня следующий код.выход второго% d в sprintf всегда отображается как ноль.Я думаю, что я указываю неправильные спецификаторы.Может ли кто-нибудь помочь мне в получении записи строки с правильными значениями.И это должно быть достигнуто в стандарте posix.Спасибо за ввод

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);
    }

Вывод:

The string is
OD DB File Size = 100 bytes      XML file size = 0 bytes 

Ответы [ 3 ]

14 голосов
/ 28 февраля 2011

Вам необходимо использовать % I64u с Visual C ++.

Однако в большинстве компиляторов C / C ++ 64-разрядное целое число является длинным. Поэтому, используйте long long и используйте % llu .

13 голосов
/ 28 февраля 2011

Я не знаю, что говорит POSIX по этому поводу, но это прекрасно обрабатывается ядром 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 );
}

Если ваш компилятор не совместим с C99, приобретите другой компилятор. (Да, я смотрю на тебя, Visual Studio.)

PS: Если вы беспокоитесь о переносимости, не используйте %lld. Это для long long, но нет никаких гарантий, что long long фактически совпадает с _int64 (POSIX) или int64_t (C99).

Редактировать: Mea culpa - я более или менее бездумно "ищу и заменяю" d 1019 * на int64_t, даже не смотря на то, что я делаю. Спасибо за комментарии, указывающие, что это uint64_t, а не unsigned int64_t. Исправлено.

11 голосов
/ 28 февраля 2011

Если вы ищете портативное решение, используйте printf macros из <inttypes.h>.Вам может потребоваться определить __STDC_FORMAT_MACROS, чтобы сделать их доступными в C ++.

...