157

off_tや などのタイプを印刷しようとしていますsize_tprintf() ポータブルの正しいプレースホルダーは何ですか?

または、これらの変数を出力するまったく別の方法はありますか?

4

10 に答える 10

121

zsize_tとtptrdiff_tには次のように使用できます

printf("%zu %td", size, ptrdiff);

しかし、私のマンページには、古いライブラリの中には、それとは異なる文字zを使用していて、その使用を思いとどまらせるものがあると書かれています。それにもかかわらず、それは標準化されています(C99標準によって)。それらintmax_tint8_tofstdint.hなどについては、別の回答が言ったように、使用できるマクロがあります。

printf("value: %" PRId32, some_int32_t);
printf("value: %" PRIu16, some_uint16_t);

それらはのマンページにリストされていinttypes.hます。

個人的には、私は値をキャストするunsigned longlong、別の回答が推奨するようにします。C99を使用する場合は、unsigned long longまたはにキャストして、またはの形式をそれぞれlong long使用できます(もちろん、使用する必要があります)。%llu%lld

于 2009-02-25T17:38:34.323 に答える
117

印刷するにはoff_t

printf("%jd\n", (intmax_t)x);

印刷するにはsize_t

printf("%zu\n", x);

印刷するにはssize_t

printf("%zd\n", x);

C99標準の7.19.6.1/7、またはフォーマットコードのより便利なPOSIXドキュメントを参照してください。

http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html

実装がこれらのフォーマットコードをサポートしていない場合(たとえば、C89を使用しているため)、AFAIKにはフォーマットコードを持ち、同じくらい大きいことが保証されている整数型がないため、少し問題があります。これらのタイプとして。したがって、実装固有の何かを行う必要があります。

たとえば、コンパイラがlong longを持っていて、標準ライブラリがをサポートしている%lld場合、それがの代わりに機能することを自信を持って期待できますintmax_t。ただし、そうでない場合は、にフォールバックする必要があります。longこれは、小さすぎるため、他のいくつかの実装では失敗します。

于 2011-03-09T20:44:52.897 に答える
5

Microsoft の場合、答えは異なります。VS2013 は大部分が C99 に準拠していますが、「hh、j、z、および t の長さのプレフィックスはサポートされていません」。size_t の場合、「つまり、32 ビット プラットフォームでは unsigned __int32、64 ビット プラットフォームでは unsigned __int64」は、型指定子 o、u、x、または X でプレフィックス I (大文字の目) を使用します 。VS2013 のサイズ仕様を参照してください。

off_t については、VC\include\sys\types.h で long と定義されています。

于 2014-03-20T15:39:47.287 に答える
3

inttypes.hのフォーマットマクロを使用することをお勧めします。

この質問を参照してください: size_t型の変数のクロスプラットフォームフォーマット文字列?

于 2009-02-25T17:39:57.050 に答える
1

man 3 printfLinux、OS X、およびOpenBSDを見ると、すべて(C99の場合)のサポートが示されていますが、それらのいずれも言及されていませ%zん。世の中の提案は通常、の変換を提供します。これは、私が知る限り「十分に正しい」です(64ビットシステムと32ビットシステムの両方で同じように異なります)。size_t%tptrdiff_toff_t%uoff_tunsigned intoff_t

于 2009-02-25T17:37:30.380 に答える
-3

受け入れられた答えを思い出すのが難しいため、この投稿を少なくとも2回見ました(zまたはjフラグを使用することはめったになく、プラットフォームに依存していないようです)。

標準ではの正確なデータ長が明確に規定されていないため、まずプラットフォームsize_tで長さを確認してから、そのうちの 1 つを選択することをお勧めします。size_t

if sizeof(size_t) == 4 use PRIu32
if sizeof(size_t) == 8 use PRIu64

stdintまた、一貫性を保つために生データ型ではなく型を使用することをお勧めします。

于 2016-10-14T08:30:13.080 に答える
-9

off_t には「%zo」を使用します。(8 進数) または 10 進数の場合は "%zu"。

于 2010-03-26T11:19:10.307 に答える