質問

監督-選手コメン印刷のような種類 off_tsize_t.何が正しいプレースホルダーのための printf() このポータブル?

それには、まったく別の方法で印刷その変数には?

役に立ちましたか?

解決

は、

のようにptrdiff_tのためsize_t型とzためtを使用することができます
printf("%zu %td", size, ptrdiff);

しかし、私のmanページには、いくつかの古いライブラリはzとは異なる文字を使用し、それを使用することを推奨してい言います。それにもかかわらず、それは(C99標準で)標準化されたのです。別の答えが言ったようなので、上のものintmax_tint8_tstdint.hとするために、使用できるマクロは、存在します:

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

これらはinttypes.hのmanページに記載されています。

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

他のヒント

off_tを印刷するには:

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

size_tを印刷するには:

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

ssize_tを印刷するには:

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

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

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

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

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

Microsoft、その答えは異なります。VS2013がC99の対応が、"hh,j,z,tの長さの接頭辞には対応しておりません。" のためのsize_t "それは、符号なし__int32 32-bitプラットフォームに、unsigned__int64 64-bitプラットフォームを使用"の接頭辞(資本)タイプ指定子o、u、x、X 見VS2013サイズ仕様

てoff_tに定義されてVCがsys\。hです。

あなたはCのどのバージョンを使用していますか?

C90では、標準的な慣行は、それに応じて適切な、印刷として、符号付きまたは符号なしlongにキャストすることです。私はsize_tのための%Zを見てきましたが、ハービソン及びスティールのprintf()の下でそれを言及していない、そしてどのような場合にはptrdiff_tのか、何のお手伝いをしていないだろうと。

C99では、ファイルを含める"Size is " FOO " bytes."のようなものは、私は詳細を知らないので、様々なタイプの_tは、自分自身のprintfのマクロが付属していますが、それはかなり大きな数値形式の一部です。

あなたはinttypes.hから書式設定のマクロを使用するとよいでしょう。

の変数のためのクロスプラットフォームのフォーマット文字列:

この質問を参照してくださいタイプsize_tの?

Linuxでは、OS X、およびOpenBSDのman 3 printfため%zsize_tため%tのためのすべてのショーのサポート(C99用)、上ptrdiff_tますが、それらの言及のoff_tのどれを見てみます。野生での提案は、通常、私の知る限り(%uoff_t両方が64ビットと32ビットのシステム間で同一の変化)「十分に正確」である、unsigned intoff_t変換を提供しています。

またこの後少なくとも、での受け答えが難しい記憶んで使わないもん z または j 国旗とかいないと思い platform大聖堂と象の噴水).

標準 言うことはありません明確にし、正確なデータの長さ size_t, であることをまずチェックの長さ size_t お使いのプラットフォームを選択して:

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

とあることを stdint 種類の代わりに原データの種類consistancy.

私が思い出すと、それを行うための唯一の移植方法、「符号なしlong int型」に結果をキャストし、%luを使用することです。

printf("sizeof(int) = %lu", (unsigned long) sizeof(int));

off_t型のための "%ZO" を使用。 (8進数) 小数または "%のZU" ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top