出力変換指定子

sprintf、vsprintf、printf などの関数では、% を使用して、出力するデータの書式を指定します。たとえば、次のようになります。
printf( "%s", "123" ); // → "123"
printf( "%4d", 456 ); // → " 456"
printf( "%05X", 254 ); // → "000FE"
printf( "%-5s", "abc" ); // → "abc "
printf( "%f", 12.56637061 ); // → "12.566371"
printf( "%.2f", 12.56637061 ); // → "12.56"
printf( "%e", 12.56637061 ); // → "1.256637e+001"
printf( "%g", 12.56637061 ); // → "12.5664"
printf( "xyz%n", &i ); // i に出力バイト数 (3) が入る

出力変換指定子の構文は、次のとおりです。

%[flags][width][.precision][modifier]type

flags (フラグ)

- 出力内容より width が大きい場合に、左に寄せて出力します。出力内容より width が小さい場合は、効果がありません。
+ 負でない数に「+」を付加します。type が数値でなければ無視されます。
(空白) 同上
# 型がわかる形式で数値を出力します。
  • 8 進数 − 先頭に 0 が付加されます。
  • 16 進数 − 先頭に 0x または 0X が付加されます。
  • 浮動小数点数 − 必ず小数点が出力されます。g または G 形式の場合は、末尾の不要な 0 も削除されません。
, 整数を 3 桁ごとにカンマ (,) で区切ります。[LC]

width (出力幅)

(数字) 出力全体の桁数を指定します。先頭に 0 を付けると、余分な桁は文字 0 で埋められます。それ以外の場合は、スペース文字で埋められます。
* 次の int 型の引数で渡された値が使用されます。値が負の場合は、左寄せになります。
printf( "i=%*d\n", 10, i ); // i を 10 桁で表示

precision (精度)

(数字) 出力桁数を指定します。負の precision は無視されます。ピリオドだけを記述して数値を省略すると、0 と見なされます。効果は type によって異なります。
  • 整数 − 出力内容が指定桁数に満たない場合は、左側に文字 0 が補充されます。出力内容が指定桁数を超える場合は、効果がありません。precision が 0 で出力も 0 の場合は、何も出力されません。既定値は 1 です。
    printf( "%5.3d", 12 ); // " 012" と表示される
  • f, e, E − 小数点以下の桁数を指定します。0 を指定すると、flags に # を指定しない限り、小数点も出力されません。既定値は 6 です。
  • g, G − 整数部と小数部を合わせた桁数を指定します。既定値は 6 です。
  • 文字列 − 出力の最大桁数を指定します。
* width と同様に、次の int 型の引数で渡された値を使用します。

modifier (修飾子)

h type で整数を指定する場合に、引数が short 型であることを示します。Light C では int と short が同一なので、効果はありません。
l type で整数を指定する場合に、引数が long 型であることを示します。
L type で小数を指定する場合に、引数が long double 型であることを示します。Light C では long double と double が同一なので、効果はありません。
F type で文字列 (s) またはポインタ (p) を指定する場合に、引数が far ポインタであることを示します。
N type で文字列 (s) またはポインタ (p) を指定する場合に、引数が near ポインタであることを示します。

type (型)

引数の型を指定します。

d int 値を符号付き 10 進数として出力します。
i d と同じです。
u int 値を符号なし 10 進数として出力します。
X int 値を符号なし 16 進数として出力します。10 〜 15 の桁は 'A' 〜'F' で表されます。
x int 値を符号なし 16 進数として出力します。10 〜 15 の桁は 'a' 〜'f' で表されます。
o int 値を符号なし 8 進数として出力します。
q int 値を符号なし 4 進数として出力します。[LC]
b int 値を符号なし 2 進数として出力します。[LC]
p ポインタの値を 16 進数で出力します。
s ヌル終端文字列へのポインタを受け取り、文字列を出力します。
c int 値を文字として出力します。Shift-JIS の全角文字も出力できます。
S ワイド文字列を出力します。
C c と同じです。
f double 値を通常の小数表現で出力します (例:12.566371)。
e double 値を指数表現で出力します (例:1.256637e+001)。
E e の代わりに E を出力することを除き、e と同じです (例:1.256637E+001)。
g 数値の大きさに応じて、f または e のいずれかの書式で出力します (例:12.5664、2.99792e+008)。数値の絶対値が大きすぎて precision の桁数に収まらない場合と、数値の絶対値が 0.0001 より小さい場合は、e 形式が使用されます。それ以外の場合は、f 形式が使用されます。
G e の代わりに E を出力することを除き、g と同じです。
n 次の引数で指される int 変数に、これまでに出力したバイト数を格納します。
printf( "xyz%n", &i ); // i に 3 が入る

メモ 1   % 自体を出力するには、「%%」と記述します。

メモ 2   char 型の数値は、関数に渡されるときに自動的に int 型に変換されるため (汎整数拡張)、int 型と同じように「%d」、「%X」などを使って表示できます。

メモ 3   float 型の数値は、関数に渡されるときに自動的に double 型に変換されるため、double 型と同じように「%f」、「%e」などを使って表示できます。

参照   入力変換指定子