次のコードがあります。 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
これについて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-何をしているのか実際に見なくても、私は多かれ少なかれ_int64
をint64_t
に頭を使って「検索して置き換え」ました。 uint64_t
ではなくunsigned int64_t
であることを指摘するコメントをお寄せいただきありがとうございます。修正。
Visual C++では%I64を使用する必要があります。
ただし、ほとんどのC/C++コンパイラでは、64ビット整数はlong longです。したがって、long longを使用して%llを使用することを採用します。
ポータブルなソリューションを探している場合は、<inttypes.h>
の- printfマクロ を使用してください。これらをC++で使用できるようにするには、__STDC_FORMAT_MACROS
を定義する必要がある場合があります。