C言語基礎|printfの変換指定

printfの変換指定 ― 表示を思いどおりに整える

ここまでのプログラムでは、数値をそのまま表示するだけでした。
しかし実際のプログラムでは、

  • 数値をきれいにそろえて表示したい。
  • 小数点以下の桁数を制御したい。
  • 表のように見やすく出力したい。

といった場面がよく出てきます。

そのときに重要になるのが、printf 関数の変換指定です。
この記事では、printf がどのように表示形式を制御しているのかを、具体例を交えながら見ていきましょう。

合計値と平均値を3つの値で求める

まずは、三つの整数値を読み込んで、
合計値と平均値を表示するプログラムを考えます。

平均値は実数で表示したいので、キャストも使います。

サンプルプログラム(変換指定を使った表示)

プロジェクト名:chap2-10-1 ソースファイル名:chap2-10-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 三つの整数値を読み込んで合計値と平均値を表示
#include <stdio.h>

int main(void)
{
    int x, y, z;

    puts("三つの整数を入力してください。");
    printf("整数x:"); scanf("%d", &x);
    printf("整数y:"); scanf("%d", &y);
    printf("整数z:"); scanf("%d", &z);

    int total = x + y + z;              // 合計
    double average = (double)total / 3; // 平均(キャスト使用)

    printf("合計は%5dです。\n", total);
    printf("平均は%5.1fです。\n", average);

    return 0;
}

実行例

三つの整数を入力してください。
整数x:87
整数y:45
整数z:59
合計は  191です。
平均は 63.7です。

ここで注目してほしいのが、次の2つの変換指定です。

  • %5d
  • %5.1f

変換指定は何をしているのか?

printf 関数の書式文字列では、
% から始まる特別な記号によって、表示形式を細かく指定できます。

今回使った指定の意味を整理してみましょう。

変換指定意味
%5d整数を少なくとも5桁で表示
%5.1f実数を少なくとも5桁で表示し、小数点以下は1桁

桁数が足りない場合は、左側に空白が補われるのがポイントです。

変換指定の全体構造

変換指定は、次のような部品で構成されています。

% [フラグ] [最小フィールド幅] [.精度] 変換指定子

これを図のイメージで表すと、次のようになります。

部分役割
フラグ表示の寄せ方や 0 埋めなど
最小フィールド幅最低限確保する表示幅
精度表示する桁数
変換指定子データの型

フラグ ― 表示の細かな指定

よく使われるフラグには、次のようなものがあります。

フラグ意味
0空白の代わりに 0 を詰める。
-左寄せで表示する。

最小フィールド幅 ― 桁をそろえる

最小フィールド幅は、最低限この桁数は確保するという指定です。

次の例で見てみましょう。

printf("[%d]\n", 123);
printf("[%4d]\n", 123);
printf("[%04d]\n", 123);
printf("[%-4d]\n", 123);

表示結果は次のようになります。

[123]
[ 123]
[0123]
[123 ]
  • 指定した桁数より短い場合は、空白や 0 が補われる。
  • 数値が桁数を超える場合は、そのまま表示される。

というルールになっています。

精度 ― 小数点以下を制御する

浮動小数点数では、精度がとても重要です。

printf("[%f]\n", 123.13);
printf("[%.1f]\n", 123.13);
printf("[%6.1f]\n", 123.13);

結果は次のとおりです。

[123.130000]
[123.1]
[ 123.1]

精度を省略した場合、
小数点以下は6桁 表示されるのが printf の標準動作です。

変換指定子 ― 型を決める最重要ポイント

最後に指定する文字が、変換指定子です。

指定子対応する型内容
dint10進整数
fdouble浮動小数点数

型と指定子が合っていないと、
正しく表示されなかったり、未定義動作になることがあります。

ここまでのポイントまとめ

  • printf の変換指定は表示形式を細かく制御できる。
  • 桁揃えや小数点以下の桁数指定にとても便利
  • 数値の型に合った変換指定子を使うことが重要

演習問題

演習 2-6

身長を整数値として読み込み、
標準体重を実数で表示するプログラムを作成せよ。

標準体重は
(身長 − 100)× 0.9
によって求め、小数点以下を1桁だけ表示すること。

解答例

プロジェクト名:chap2-10-2 ソースファイル名:chap2-10-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

#include <stdio.h>

int main(void)
{
    int height;
    double weight;

    printf("身長を入力せよ:");
    scanf("%d", &height);

    weight = (height - 100) * 0.9;

    printf("標準体重は%5.1fです。\n", weight);

    return 0;
}