22

私は次のコードを持っています。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 
4

4 に答える 4

18

これについて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でください。これは 用ですが、実際に(POSIX) や(C99)と同じであるlong longという保証はありません。long long_int64int64_t

編集: Mea culpa - 私は多かれ少なかれ無意識のうちに、自分が何をしているのかを実際に見ずに「検索&置換」_int64しました。ではないint64_tことを指摘してくれたコメントに感謝します。修正しました。uint64_tunsigned int64_t

于 2011-02-28T10:44:33.017 に答える
17

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

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

于 2011-02-28T10:41:32.020 に答える
11

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

于 2011-02-28T10:49:13.773 に答える