printfの書式指定
印には意味がある
前回、変数の値を出すために %d や %f を使いました。この % から始まる印を書式指定子と呼びます。書式指定子は「ここに値を入れてください」という合図であると同時に、「どの型の値をどう並べるか」の指示でもあります。
型と印は必ず対応させる
よく使うのは次の4つです。
%dint を10進数で出す%fdouble を小数で出す%cchar を1文字で出す%s文字列を出す
C は printf に渡した値の型を実行時に確かめてくれません。int を %f で出すと、意味のない数が出たり、うしろの値までずれたりします。型と印は必ず揃えてください。なお % そのものを出したいときは %% と2つ重ねます。
小数の桁を決める
%f は小数点以下を6桁出します。平均点を「78.500000点」と出すのは読みにくいので、桁を指定します。%.1f と書けば小数点以下1桁、%.2f なら2桁です。指定した桁で四捨五入されます。
double average = 78.456;
printf("%.1f\n", average); /* 78.5 */
printf("%.2f\n", average); /* 78.46 */幅を決めて右揃えにする
成績表のように数を縦に並べるときは、桁数がばらばらだと読みにくくなります。% と印のあいだに数を書くと、その幅を確保して右に寄せてくれます。
printf("国語%6d点\n", 78); /* 国語 78点 */
printf("数学%6d点\n", 92); /* 数学 92点 */%6d は「最低6文字ぶんの場所を取って右揃え」という意味です。78 は2文字なので、左に4つ空白が入ります。値が6文字を超えたときは切り詰めずにそのまま出るので、表示が消えることはありません。
小数にも同じ指定ができます。%6.1f は「全体で6文字、うち小数点以下1桁」です。78.0 なら 78.0 の4文字なので左に2つ空白が入ります。int を %6d、double を %6.1f で揃えると、単位の「点」が同じ位置に並びます。
左に寄せたいときはマイナスを付ける
幅の数字の前に - を書くと、右揃えではなく左揃えになります。科目名のようなラベルを並べるときに使います。
printf("%-6d|\n", 78); /* 78 | */
printf("%6d|\n", 78); /* 78| */なお %-8s のように文字列へ幅を指定すると、C は文字数ではなくバイト数で数えます。日本語は1文字あたり3バイトになるため見た目が揃いません。日本語を含む表では、幅指定は数値の側だけに使うのが安全です。
空白は expected でも数える
この講座の採点は、あなたのプログラムの出力を1文字ずつ突き合わせます。行末の空白と最後の改行は無視しますが、行の途中や先頭の空白は区別されます。幅指定を1つ間違えるだけで不合格になるので、幅の数字は問題文のとおりに書いてください。
要件
- 点数は int、平均は double の変数に入れる
- 点数の3行は %6d を使って出す
- 平均の行は %6.1f を使って出す
- 国語 78、数学 92、英語 64、平均 78.0 を使う
入出力例
main("") → "国語 78点
数学 92点
英語 64点
平均 78.0点"