web-dev-qa-db-ja.com

符号なし_int64のsprintf

次のコードがあります。 sprintfの2番目の%dの出力は常にゼロとして表示されます。私は間違った指定子を指定していると思います。誰かが正しい値で文字列を書くのを手伝ってくれる?そして、これは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 
19
venkysmarty

これについて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-何をしているのか実際に見なくても、私は多かれ少なかれ_int64int64_tに頭を使って「検索して置き換え」ました。 uint64_tではなくunsigned int64_tであることを指摘するコメントをお寄せいただきありがとうございます。修正。

14
DevSolar

Visual C++では%I64を使用する必要があります。

ただし、ほとんどのC/C++コンパイラでは、64ビット整数はlong longです。したがって、long longを使用して%llを使用することを採用します。

14
Shamim Hafiz

ポータブルなソリューションを探している場合は、<inttypes.h>の-​​ printfマクロ を使用してください。これらをC++で使用できるようにするには、__STDC_FORMAT_MACROSを定義する必要がある場合があります。

11