printfの書式指定

印には意味がある

前回、変数の値を出すために %d%f を使いました。この % から始まる印を書式指定子と呼びます。書式指定子は「ここに値を入れてください」という合図であると同時に、「どの型の値をどう並べるか」の指示でもあります。

型と印は必ず対応させる

よく使うのは次の4つです。

  • %d int を10進数で出す
  • %f double を小数で出す
  • %c char を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つ間違えるだけで不合格になるので、幅の数字は問題文のとおりに書いてください。

要件

  1. 点数は int、平均は double の変数に入れる
  2. 点数の3行は %6d を使って出す
  3. 平均の行は %6.1f を使って出す
  4. 国語 78、数学 92、英語 64、平均 78.0 を使う

入出力例

main("") → "国語 78数学 92英語 64平均 78.0点"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.c
学習モード

メモ

printfの書式指定

⌘S で保存