printf関数 オプション

May 31st, 2021

基本的に man 3 printf の説明を訳したものとなります。

WIPの部分もありますが、徐々に例を足したり、説明を加えていこうと思います。

printfとは

Cライブラリの関数であり、文字列を標準出力します。

文字列に埋め込まれた フォーマット指定子(format specifier) を埋め込むことができます。

埋め込まれたフォーマット指定子は後続の追加引数で指定された値で置き換えられます。

例えば、以下の様に10進数整数を表す %d が 100 に置きかわります。

printf("健康に %d 歳までは生きたい!🥺", 100);

printfのフォーマット指定子のプロトタイプ

フォーマット指定子は実は以下の様な形になっています。

左から各内容を整理していきます。

# [] は任意です。
%[flag][width][.precision][length]conversion specifier

フラグ (flag)

種類説明
#c, d, i, n, p, s, uの変換ではこのオプションは何の効果もない。oの変換では o, x, X と指定すると先頭文字に 0, 0x, 0X が表示されるので数値のprecisionも上がる。e、E、f を使うと数字が後に続かなくても書き込まれる出力に強制的に小数点を出力。e, E, f, F, g, G の変換では桁が続かなくても、常に小数点を含む。(通常、これらの変換の結果には桁が続く場合にのみ小数点が現れる。)gとGの変換では、最後のゼロは結果から取り除かれない。
0空白の代わりに0で左詰する。(値の左側の空白を0に変える。)
-左揃えにする。デフォルトは右揃えになる。
space符号記入しない場合は値の前にスペースを挿入(正の値の場合には半角スペースをつける。)
+符号付で値を返す。(デフォルトで負の値には-がつくが、正の値にも+の符号をつける。)

(最小の)フィールド幅 (width)

変換した結果がその長さ以下であった場合に左側が空白で埋められる。

指定した数だけスペースが左に挿入される。

指定した数以上の長さならば無視される。

#include <stdio.h>

int main() {
  printf("%5d\n", 1);
  //    1
  // ↑ 4つ分spaceが入っている。

  printf("%5d\n", 55555);
  //55555
  // ↑ スペース無し。(指定幅以上の数値の場合はspaceは無視される。)

  printf("%2d\n", 7);
  // 7
  // ↑ 1つ分spaceが入っている。
}

精度 (precision)

精度は ピリオド . の後に任意の桁数を10進数、もしくはアルタリスク(*)で指定できる。

  • アスタリスクはprintfの後続の引数の数値を取る。
  • ピリオドだけで数値を省略した場合は0を指定した事になる。

d,i,o,u,x,X の変換のために表示される最小桁数を決める。 a,A,e,E,f,F の変換において,小数点以下に表示される桁数を決める。

変換修飾子 (length)

修飾子と変換指定子対応表

修飾子d, io, u, x, Xn
hhsigned charunsigned charsigned char *
hshortunsigned shortshort *
l (ell)longunsigned longlong *
ll (ell ell)long longunsigned long longlong long *
jintmax_tuintmax_tintmax_t *
tptrdiff_tNoteを参照ptrdiff_t *
zNoteを参照size_tNoteを参照
q (deprecated)quad_tuquadtquad_t *

Note:

t 修飾子は,o, u, x, または X 変換に適用されたとき,引数が ptrdifft と同等のサイズの 符号なし型であることを示します。t 修飾子は,引数が ptrdifft と同等のサイズの符号なしの型であることを示します。 z 修飾子はz 修飾子は,d または i の変換に適用されるとき,引数が ptrdifft と同等のサイズの符号付き型であることを示します。z 修飾子は,d または i の変換に適用されるとき,引数が sizet と同等のサイズの符号付き型であることを示します。 同様に,n変換に適用されると,それは引数が sizet と同等の符号付き型であることを示します。バージョンに適用された場合,これは,引数が sizet と同等のサイズの符号付き型へのポインタであることを示します。

  • 以下の修飾子は、a、A、e、E、f、F、g、Gの変換時に有効です。
Modifiera, A, e, E, f, F, g, G
l (ell)double
Llong double
  • 以下の修飾子は、a、A、e、E、f、F、g、Gの変換時に有効です。
Modifierc, s
l (ell)wint_twchar_t *

printfの変換指定子 (conversion specifiers)

指定子説明
d, iintを取り、signedな10進数に変換
o,u,x,Xunsignedなintを取り、o(octal 8進数), u(decimal 10進数), x X(hexadecimal 16進数)へと変換する。xとXは小文字か大文字かの違いです。
D,O,Ulongなintを取り、Dはsignedなdecimal(10進数)に, Oはunsignedなoctal(8進数), Uはunsignedなdecimal(10進数)になる。それぞれld, lo, luと同様です。
e, Edoubleを取り、 -0.000000e±00 の形式で変換されます。小数点の前には一桁だけ残る形になり、小数点はデフォルトでは6桁分ですが、precisionがあればその数と等しくなります。precisionが0ならば小数点も表示されません。e± は仮数10の指数(exponent)という意味。例えば、e+03 は10の3乗ということになる。Eなら出力時のeがEになるだけ。
f, Fdoubleを取り、指定されたprecisionにして一般的に利用される-0.000000の様な表記にする。デフォルトではprecisionは6なので小数点の桁は6桁になる。
g, Gdoubleを取り、fまたはe(G変換の場合はFまたはE)で変換。 精度がない場合,6桁が与えられます。precisionがゼロであれば,それは1として扱われます。指数が、-4より小さいか、precision以上の場合はe。 末尾のゼロは,結果の小数部分から取り除かれます。小数点は少なくとも1桁続いている場合にのみ現れます。
a, Adoubleを取り、-1.000000p±00という形の16進数になる。precisionが不足している場合、浮動小数点数を正確に表現するのに十分であるとみなされ変換されない。precisionが0であれば,16進法の文字は現れない。指数は正または負の符号と,それに続く仮数2の指数を表す10進数で構成される。Aの変換では大文字になるだけで、「0x」ではなく「0X」という接頭辞に、0X以降に続く文字では「ABCDEF」で16進数を表し、仮数と指数を分離するための文字は「P」を使用します。
Cl(エル)の修飾語が付いたcとして扱わる。...WIP
cintを取り、unsigned charに変換されASCII文字で表示される。
Sl(エル)の修飾語がついたsとして扱われます。...WIP
s文字列の配列ポインタを取り、出力する。文字列はNULL文字か'\0'で終わっている必要がある。
Pvoid * を取る。アドレス値を表示をする。16進数で表示される。(%#x や %#lx のように表示される)...WIP
nこれまでに書き込まれた文字数が、ポインタ引数int *(またはvariant)で示される整数に格納される。引数は変換されません。フォーマット引数この指定子を使用する場合は、書き込み保護されたメモリになければなりません。...WIP
%% が書き込まれます。引数は変換されません。完全な変換仕様は。%% です。

a, Aの例

printf("%A\n", 1.0);
// 0X1P+0
// 1 * 2^0 = 1.0

printf("%A\n", 3.0);
// 0X1.8P+1
// (1 + 1/16 * 8) 2^1 = 3.0

printf("%A\n", 5.0);
// 0X1.4P+2
// (1 + 1/16 * 4) * 2^2 = 5.0

その他

WIP