printf出力書式まとめ

作成:

フラグ

出力書式について、最後はフラグについて説明する。

%[フラグ][最小フィールド幅].[精度][長さ修飾子][変換指定子]

今回は「最小フィールド幅」と「精度」である。

以下の一覧は、変換指定子と同じく、manの説明の抜粋+私の注釈である。

フラグ意味
# 変換形式を変更する。 o変換で、先頭文字が必ず、0になるように変換される。 xとX変換で先頭に0x(Xの場合0X)がつくように変換される。 実数変換では小数点に続く数字がないときでも小数点をつける。 gとG変換では、末尾の0が削除されない。
0 変換した値の左側を空白の代わりに0で埋める。
- フィールド幅指定の揃えを左揃えにする。
(半角スペース) 符号付き変換で、デフォルトでは負の場合にのみ-の符号がつくが、正の場合に符号の位置に半角スペースを配置する。
+ 符号付き変換で、デフォルトでは負の場合にのみ-の符号がつくが、正の場合には+をつける。

符号以外のところは、言葉で説明されても判然としないと思うので、実例をあげる。

printf("%o\n", 10);
printf("%#o\n", 10);
printf("%#o\n", 0);
printf("%x\n", 10);
printf("%#x\n", 10);
printf("%#x\n", 0);
printf("%X\n", 10);
printf("%#X\n", 10);
printf("%#X\n", 0);
printf("%.0f\n", 1.0);
printf("%#.0f\n", 1.0);
printf("%g\n", 1.0);
printf("%#g\n", 1.0);
12
012
0
a
0xa
0
A
0XA
0
1
1.
1
1.00000

#をつけると、変換のされ方が変わる、oは0、xは0x、Xは0Xが頭に出力される。 ただし、変換結果が0の時は何も付けられない。 また、実数出力で精度0の場合、小数点が省略されるが、#をつけると省略されない。gの末尾0も省略されなくなる。

実数変換の時はともかく、整数変換の場合、0の場合は出力されないなど、ちょっと使い勝手が悪い。 フォーマットを揃えたい場合は、変換の一環ではなく固定文字列として0xなどと記述することになる。

0をつけた場合、先行ゼロ埋めが行われる。 これは一目瞭然だと思う。次の-を指定した場合と同時に指定された場合は、 0の指定が無視される。

printf("%010d\n", 1);
printf("%010f\n", 1.);
0000000001
001.000000

-を指定した場合、フィールド内が左詰めに変わる

printf("[%10s]\n", "1234");
printf("[%-10s]\n", "1234");
printf("[%10d]\n", 1);
printf("[%-10d]\n", 1);
printf("[%10f]\n", 1.);
printf("[%-10f]\n", 1.);
[      1234]
[1234      ]
[         1]
[1         ]
[  1.000000]
[1.000000  ]

デフォルトでは負の場合にのみ符号が表示されるため、 正負両方の値が入り混じった場合に、数字の桁揃えがうまくいかない。 そこで +を指定した場合、正の場合にスペースや+符号が追加され、 数字の桁揃えを行うことができる。

printf("%d\n", 1);
printf("%d\n", -1);
printf("% d\n", 1);
printf("% d\n", -1);
printf("%+d\n", 1);
printf("%+d\n", -1);
1
-1
 1
-1
+1
-1

というわけで、以上4回にわたって、出力書式について説明してきた。 一般的には全部の知識を総動員しなければいけないということは少なく、 自分がよく使うパターンについて幾つか覚えておけば良い程度だ。 また、こういう変換書式に頼らない整形を行うこともできるし、 臨機応変に使いこなしていただければ良いと思う。