出力書式について、詳しく勉強したい。
「%*d」、「%-10s」の意味が全く分からない!
とにかくC言語で「%」を見たら嫌になる…
この記事を読めば、これらの悩みを解決できます。
出力書式ってそもそも何?

まずは、出力書式をよく理解しましょう。出力書式とは、「プログラムで出力をするときに、どういう書式で出力するか?」を指定するものです。逆に、入力するときは入力書式というものを使います。この2つを合わせて変換書式と言います。変換書式は、「%」の後に数字やアルファベットを用いて表します。また、変換指定子と呼ぶこともあります。
これらのワードを知らなかった人は、まずはprintf関数から勉強してみましょう。
また、こちらも参考にしてください。
出力書式のフォーマットを覚えよう!
出力書式を完璧にしたいなら、まずは出力書式のフォーマットを覚えるべきです!それがこちらです。
%[フラグ][最小フィールド幅].[精度][長さ修飾子][変換指定子]
左側から順に解説していきます。
フラグとは?
フラグは全部で5種類あります。
記号 | 意味 |
- | 出力内容より最小フィールド幅が大きい場合に、左に寄せて出力(出力内容より最小フィールド幅が小さい場合は効果ない) |
+ | 正の数に「+」を付加(変換指定子が数値でなければ無視) |
スペースキー | 正の数に「+」を付加(変換指定子が数値でなければ無視) |
# | <8進数> 0が先頭に付加される <16進数> 0xまたは0Xが先頭に付加される <浮動小数点数> 小数点が出力される <g,G> 末尾の不要な0が削除されない |
, | 3桁ごとにカンマで区切る |
出力幅とは?
記号 | 意味 |
数字 (0~9) | 出力全体の桁数を指定、余りをスペースで埋める(先頭に 0 を付けると、余分な桁は文字 0 で埋められる) |
* | 出力全体の桁数を指定、余りをスペースで埋める |
「*」は
printf( "i=%*d", 10, i );
のようにして桁数を指定します。この場合、10マスで「i」を出力することになります。
精度とは?
記号 | 意味 |
数字 (0~9) | 出力桁数を指定 負の場合は無視 ピリオドを記述して数値を省略➔0と同じ <整数> 出力内容が指定桁数に満たない➔左側に文字0で埋める 出力内容が指定桁数を超える➔変化ない (精度=0)かつ(変数の値=0)➔何も出力されない <f, e,E> 小数点以下の桁数を指定 0を指定すると、フラグに#を指定しない限り、小数点も出力されない <g,G> 整数部と小数部を合わせた桁数を指定 <文字列> 出力の最大桁数を指定 |
* | 出力全体の桁数を指定、余りをスペースで埋める |
長さ修飾子とは?
記号 | 意味 |
h | 長さ修飾子で整数を指定する場合に、引数がshort型であることを示す Light C では int と short が同一なので、効果ない |
l | 長さ修飾子で整数を指定する場合に、引数がlong型であることを示す |
L | 長さ修飾子で小数を指定する場合に、引数がlong double型であることを示す Light Cではlong doubleとdoubleが同一なので、効果はない |
F | 長さ修飾子で文字列(s)またはポインタ(p)を指定する場合に、引数がfarポインタであることを示す |
N | 長さ修飾子で文字列(s)またはポインタ(p)を指定する場合に、引数がnearポインタであることを示す |
型とは?
記号 | 意味 |
d | int 値を符号付き10進数として出力 |
i | int 値を符号付き10進数として出力 |
u | int 値を符号なし10進数として出力 |
X | int 値を符号なし16進数として出力(10~15の桁は大文字で表す) |
x | int 値を符号なし16進数として出力(10~15の桁は小文字で表す) |
o | int 値を符号なし8進数として出力 |
q | int 値を符号なし4進数として出力 |
b | int 値を符号なし2進数として出力 |
p | ポインタの値を16進数で出力 |
s | ヌル終端文字列へのポインタを受け取り、文字列を出力 |
c | int 値を文字として出力(Shift-JISの全角文字も出力可) |
S | ワイド文字列を出力 |
C | int 値を文字として出力(Shift-JISの全角文字も出力可) |
f | double 値を通常の小数表現で出力 |
e | double 値を指数表現で出力 |
E | double 値を指数表現で出力 |
g | 数値の大きさに応じて、fまたはeのいずれかの書式で出力(基本はfで出力。数値の絶対値が大きすぎて精度の桁数に収まらない場合と、数値の絶対値が 0.0001 より小さい場合は、e形式が使用される) |
G | 数値の大きさに応じて、fまたはのいずれかの書式で出力(基本はfで出力。数値の絶対値が大きすぎて精度の桁数に収まらない場合と、数値の絶対値が0.0001より小さい場合は、e形式が使用される) |
n | 指定した変数に、これまでに出力したバイト数を格納する |
いくつか補足します。
eとE、gとGの違いは、指数表示で出力するときに「大文字で表すか、小文字で表すか?」だけです。例えば、「0.12345e+6」、「0.12345E+6」のように変化します。
nの具体例は
printf( "xyz%n", &i );
です。1文字につき1バイトなので、i=3になります。
まとめ

前にも話しましたがすべて覚える必要はありません。まずは、自分でプログラムをつくり、理解をしましょう。ある程度覚えられるはずです。残りは、後から自分でその情報をすぐに見つけられるようにすることが大切です。画面をスクショすれば一瞬で終わるのでおすすめです。
次は、ポインタのポインタを勉強してみましょう。