2009-02-25 63 views
121

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

これらの変数を印刷する方法はまったく異なりますか?

+2

@devin:Mac OS Xで 'fopen'や' fseek'などを使っているときにそのタイプが見つかったと思います。オフセットに 'off_t'が使われています。 –

答えて

87

あなたは

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

のようptrdiff_tのためsize_t型とtためzを使用することができます。しかし、私のマンページでは、一部の古いライブラリはzとは異なる文字を使用し、それを使用することを推奨してい言います。それにもかかわらず、標準化されています(C99規格)。彼らはinttypes.hのmanページに記載されてい

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

:別の答えが言ったように、これらのintmax_tstdint.hint8_tなどについて、使用できるマクロが、あります。

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

+0

PRId32には%format指定子が含まれていないので、 'printf(" value:% "PRId32、some_int32_t);' –

+1

off_tは実際に私のシステム上では長い符号長です。 –

+0

ええええええええええええええええええんを切たいあなたの長さをlongまたはlongに変換する必要があります。この後者の型は現在のC++には存在しませんが、次のバージョンにも含まれています。特にposixで作業していて、サイズが大きいoff_tのようないくつかのタイプが含まれている場合は、注意が必要です。 –

3

お使いのCのバージョンは?

C90では、標準的な方法として、signedまたはunsigned longにキャストして適切に印刷する方法があります。私はsize_tについて%zを見たことがありますが、HarbisonとSteeleはprintf()の下でそれを言及していませんが、ptrdiff_tなどで助けにならない場合もあります。

C99では、様々な_t型が独自のprintfマクロを持っています。"Size is " FOO " bytes."のようなものですが、詳細は分かりませんが、それはかなり大きな数値形式のインクルードファイルの一部です。

+0

H&Sのどのエディション - 第5回はほぼ確実に言及しています... –

+0

第4版 - 更新する必要がありますか? –

-3

私が思い出しているように、それを実行する唯一の方法は、結果を "unsigned long int"にキャストし、%luを使用することです。

のLinux、OS X、およびOpenBSDの上 man 3 printfで(C99用) ptrdiff_tため size_t%tため %zのためのすべてのショーのサポートを探し
printf("sizeof(int) = %lu", (unsigned long) sizeof(int)); 
+1

"%lu"でなければなりません。長さ修飾子は変換前に指定する必要があります。 – dwc

+1

たとえば、off_tは符号付きlong longです。 –

+2

これは移植性がありません。 – vy32

1

が、これらの言及off_tのどれも。通常、野生の提案は、off_t%uの変換を提供しています。これは、私が知る限り「十分に正しい」ものです(unsigned intoff_tは64ビットと32ビットシステムで同じです)。

+1

私のシステム(OS X)は32ビットの 'unsigned int'と64ビット' off_t'を持っています。したがって、キャストによってデータが失われる可能性があります。 –

3

inttypes.hの書式設定マクロを使用します。 off_t型のためCross platform format string for variables of type size_t?

+4

オフ_tのフォーマット方法には答えません。 – stepancheg

+0

off_tがptrdiff_tのような符号付きのポインタサイズのint(正確な定義がわかりません)を仮定すると、PRIdPTRまたはPRIiPTRを使用します。 –

+10

'off_t'型は、最近大部分の32ビットシステムである大容量ファイルをサポートする32ビットシステム上のポインタよりも大きくなっています。 –

-8

使用 "%のZO":

は、この質問を参照してください。 (8進数) または10進数の場合は "%zu"。

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

size_tを印刷するには:

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

ssize_tを印刷するには:off_tを印刷するには

+4

%zはsize_tに対応していませんoff_t – Draemon

+0

なぜファイルを8進でオフセットしますか? – poolie

84

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

C99標準で7.19.6.1/7を参照しますか、書式設定コードのより便利なPOSIXドキュメント:

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

(あなたがC89にしているので、例えば)あなたの実装では、これらのフォーマットのコードをサポートしていない場合は私の知る限り持っているC89の整数型が存在しないので、あなたは、問題のビットを持っていますこれらのタイプと同じくらい大きいことが保証されています。したがって、実装固有のものを行う必要があります。

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

+0

これははるかに良い答えですが、%zuをunsigned size_tに使用することについて忘れてしまいます。そして、intmax_tへのキャストは、どのプラットフォームでもoff_tが何であれ、素晴らしい解決策です。 –

+0

POSIXは 'ssize_t'が' size_t'と同じサイズであることを保証しませんので、本当に移植性のあるコードでは 'int_t_t'に変換し、' off_t'と同様に '%jd'で出力する必要があります。 – nwellnhof

-5

%luを使用してください。 Off_tは符号なしlongです。

+4

あなたは*これを保証する仕様はありますか?特定のコンパイラ/ターゲットOSで何かが真実になっても、それが常に真実であるということではありません。 – CodesInChaos

+1

それは、定義が異なるようですが、私は直感的には、非常に明白な理由から、オフセットの実装を署名付きの型にすると思います。 –

5

Microsoftの場合、その答えは異なります。 VS2013は主にC99に準拠していますが、「hh、j、z、tのプレフィックスはサポートされていません。 "で、32ビットプラットフォーム上の符号なし__INT32、64ビットプラットフォーム上の符号なし__int64" size_tの の型指定子O、off_t型としては、U、X、またはX. See VS2013 Size specification

と共に使用プレフィックスI(資本目) VC \ include \ sys \ types.hの長さで定義されています。

+0

'off_t'は常に' long'で32ビットになります(64ビットWindowsでも 'long'に32ビットを使用します)。 – sourcejedi

-2

私は受け入れられた答えが私のために記憶するのが難しいので(少なくともzまたはjフラグを使用しており、それらはplatform independantではないようです)、この投稿を少なくとも2回見ました。

standardsize_tの正確なデータ長ははっきり言ったことがないので、私はそれらのいずれかを選択し、次にあなたが最初にあなたのプラットフォーム上で長さsize_tを確認してくださいお勧め:

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

を私はstdintタイプを使用しての代わりに示唆します一貫性のための生データ型。

+0

C99とC11の場合、標準では '%zu'を使用して' size_t'値を出力できることを明示しています。 * 'uint32_t' /' uint64_t'フォーマット指定子を使って 'size_t'を出力することは決して避けてはいけません。なぜならこれらの型が互換性があるという保証はないからです。 – Sebivor

関連する問題