「printf」の課題
「printf」を自分で作る課題に取り組んでいる。
「printf」を一言でいうと、「何か」をコマンドラインに表示させるもの。
C言語を学び始めたばかりの人が一番初めに作るプログラムは、「Hello world!」 を表示させるものだが、そのプログラムにも「printf」が使われている。
「何か」を表示できるといったが、その「何か」の種類が膨大で、「printf」自体を理解することに時間を費やしている。
今までも「printf」は使っていたのだが「%s」で文字列を「%d」で整数を出力など、基本的な機能しか出力してこなかった。
よく使用するケースはプログラムをデバッグする時で、「この時、この変数には何が代入されているのだろう」と、プログラムの気になる箇所に「printf」を配置し、コマンドラインに出力して確かめている。
今回の「printf」を自作せよという課題のおかげで、「printf」にはたくさんのことを出力できるがわかった。
例えば以下の場合、
printf("[%4.3x]", 10);
(カッコ[]は出力結果を見やすくするために入力しているだけなので、お気になさらず。)
出力結果は以下のように[スペース00a]となる。
[ 00a]
「%」のあとの「4」は「最小幅(width)」で、「何文字出力するか」を決める。出力するもの(今回だと00a)が小さければ、最小幅の長さになるまで埋められる。
次の「.」は「精度(precision)」を示すもので、続く「3」自体が「精度」だ。
精度とは「出力する最大文字数」で、それ以上の長さの文字列の場合、途中で途切れてしまうような出力となる。
「x」は「変換指定子(conversion specifier)」と呼ばれるもので、たくさん種類があるのだが「x」は整数を16進数で出力する。
まとめると、10を16進数で表すと[a] となり、精度が3なので[00a]となる。
なぜ[00a]となるかというと、精度の数(ここだと3)と、桁数(ここだと「a」 だけなので1桁)を比べ、桁数が足りない場合は、先頭を0埋めすることになっている。
(逆に[aaaaaaa]とaが多かった場合、精度が3なので[aaa] と途中から途切れる)
今回だと精度3に比べて1桁しかないため、2つの0が先頭に加わり[00a]となる。
最後に、最小フィールド幅が4なのでスペースが加わり[スペース004]となる(何も指定しなければ[00a]は右揃えなのでスペースは一番左側に現れる)。
しばらくは「printf」でどんなことができるのかを調べることに時間を費やすことになりそうだ。