C言語のきほん|printfで表示を整えよう

見やすい表示は、伝わるコードの第一歩。printfの書式を整えて、出力をぐっと読みやすくしよう。

printf は、文字や数値を表示するだけの関数ではありません。
実は、表示の見た目をきれいに整える ための機能がとても充実しています。

たとえば、次のようなことができます。

  • 数字を右揃え・左揃えにする
  • 桁数をそろえる
  • 小数点以下の桁数をそろえる
  • 16進数や8進数であることを見た目でわかりやすくする
  • 文字列の先頭何文字だけを表示する

こうした整形表示を覚えると、表っぽい出力や見やすいログ表示が作れるようになります。
特に学習中は、値を並べて確認したい場面が多いので、printf の整形はとても役立ちます。

ここでは、printf の書式指定の中でも、フィールド幅・フラグ・精度 を中心に、やさしく丁寧に解説していきます。
サンプルプログラムも、内容を別のシンプルな例に変更して、日本語メッセージ・日本語コメントでわかりやすく説明します。

printfの書式指定の全体像

printf の書式指定は、これまで学んだ %d や %f の前後に追加の指定を書けます。
形としては次のようなイメージです。

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

今回の学習では、特にこの3つを使います。

  • フィールド幅
  • フラグ
  • 精度

修飾子は後の章で詳しく学ぶ内容なので、ここでは無理に覚えなくて大丈夫です。

まずはイメージで理解しよう

printf の書式指定は、%d や %f をそのまま使うだけでなく、間に情報を足せます。

たとえばこんな形です。

%5d

これは「整数を、最低5桁分の幅で表示してね」という意味です。

さらに、

%-5d

なら「左詰めで5桁にしてね」になります。

そして、

%.2f

なら「小数点以下2桁で表示してね」です。

つまり、printf は「何を表示するか」だけでなく、どう見せるか も指定できる、ということですね。

フィールド幅とは

フィールド幅は、出力全体の横幅(最小の幅) を指定する機能です。
表示する値がその幅より短いときは、足りない分が空白で埋められます。

基本の書き方

  • %5d ・・・整数を最低5桁の幅で表示
  • %12f ・・・浮動小数点数を最低12桁の幅で表示

例1:右詰め5桁

printf("[%5d]\n", 10);

実行結果

[   10]

10 は2桁なので、残り3桁分が空白になります。
デフォルトでは右詰めです。

例2:幅より長い値はそのまま表示

printf("[%3d]\n", 10000);

実行結果

[10000]

指定した幅 3 より値の桁数 5 のほうが大きいので、切り捨てられたりはしません。
この場合はフィールド幅は無視されて、そのまま表示されます。

例3:小数点もフィールド幅に含まれる

printf("[%12f]\n", 123.456);

実行結果

[  123.456000]

ここでの 12 桁には、小数点も含まれます。
この点は少し見落としやすいので、覚えておくと便利です。

フィールド幅を図で見るとわかりやすい

最低5桁の「箱」を用意して、値を右側に入れるイメージです。

フラグとは

フラグは、表示スタイルを変える追加指定 です。
よく使うものを覚えるだけでも、かなり見やすい出力が作れるようになります。

今回よく使うフラグは次の4つです。

フラグ意味出力例
-左詰め%-5d[10 ]
+正の数にも + を付ける%+d+10
#表記形式を明示する%#x0xa
0空白の代わりに0で埋める%05d00010

フラグ -(左詰め)

通常は右詰めですが、- を付けると左詰めになります。

例:

printf("[%-5d]\n", 10);

実行結果

[10   ]

表のように並べたいときに便利です。

フラグ +(正の数にも+を付ける)

正の数は普通、符号なしで表示されますが、+ を付けると明示できます。

例:

printf("%+d\n", 10);

実行結果

+10

増減や差分の表示で、正負をはっきり見せたいときに便利です。

フラグ #(表記形式を明示)

8進数や16進数のときに「何進数か」をわかりやすくします。

16進数の例

printf("%#x\n", 10);

実行結果

0xa

8進数の例

printf("%#o\n", 10);

実行結果

012

16進数なら 0x、8進数なら 0 が付きます。
進数を確認したいときにとても見やすくなります。

フラグ 0(0埋め)

幅指定と組み合わせると、空白の代わりに 0 で埋められます。

例:

printf("%05d\n", 10);

実行結果

00010

ID番号や連番をそろえて表示したいときに便利です。

精度とは

精度は、小数点以下の桁数文字列の最大表示文字数 を指定する機能です。
ドット . のあとに数字を書きます。

基本の書き方

  • %.2f ・・・小数点以下2桁
  • %.5s ・・・文字列の先頭5文字まで表示

精度で小数点以下の桁数を指定する

例1:小数点以下2桁

printf("[%.2f]\n", 12345.678);

実行結果

[12345.68]

小数点以下3桁目が 8 なので、2桁に丸められて 12345.68 になります。

例2:フィールド幅と一緒に使う

printf("[%10.2f]\n", 12345.678);

実行結果

[  12345.68]

この場合は、

  • 全体の幅は10桁
  • 小数点以下は2桁

という2つの条件が同時に指定されています。

精度で文字列の最大表示長を指定する

%s にも精度指定が使えます。
このときは小数ではなく、最大何文字表示するか という意味になります。

例:

printf("[%.5s]\n", "abcdefg");

実行結果

[abcde]

先頭から5文字だけ表示されます。
長い文字列の表示を制限したいときに便利です。

書式指定の読み方を図で整理

たとえば、次の書式指定を見てみましょう。

%10.2f

分解するとこうなります。

この分解に慣れると、複雑そうに見える書式も読みやすくなります。

サンプルプログラムでまとめて確認しよう

ファイル名:5_6_1.c

#include <stdio.h>

int main(void)
{
    /* フィールド幅の確認 */
    printf("フィールド幅の例\n");
    printf("[%-8s]\n", "商品");      /* 左詰め8文字 */
    printf("[%5d]\n", 42);           /* 右詰め5桁 */
    printf("[%10.2f]\n", 98.7654);   /* 幅10、小数点以下2桁 */

    /* フラグの確認 */
    printf("\nフラグの例\n");
    printf("左詰め      : [%-5d]\n", 42);
    printf("符号付き    : [%+d]\n", 42);
    printf("16進数表記  : [%#x]\n", 42);
    printf("0埋め5桁    : [%05d]\n", 42);

    /* 精度の確認 */
    printf("\n精度の例\n");
    printf("小数2桁     : [%.2f]\n", 98.7654);
    printf("小数4桁     : [%.4f]\n", 98.7654);
    printf("文字列5文字 : [%.5s]\n", "プログラミング入門");

    return 0;
}

実行結果例

フィールド幅の例
[商品      ]
[   42]
[     98.77]

フラグの例
左詰め      : [42   ]
符号付き    : [+42]
16進数表記  : [0x2a]
0埋め5桁    : [00042]

精度の例
小数2桁     : [98.77]
小数4桁     : [98.7654]
文字列5文字 : [プロ]

※ 日本語文字列の %.5s は、環境や文字コードによって見え方が変わることがあります。教材として安定して確認したい場合は、英字文字列で試すのもおすすめです(例: Programming)。

サンプルプログラムのポイント解説

幅指定で数字をそろえると見やすい

printf("[%5d]\n", 42);

数字の桁数がバラバラでも、幅をそろえると縦に並べたときに見やすくなります。
表形式の出力でとても役立ちます。

フラグを組み合わせると意味が伝わりやすい

printf("16進数表記  : [%#x]\n", 42);

ただ %x で表示するより、%#x のほうが 0x が付くので、16進数だとすぐわかります。
見た目の親切さが上がります。

精度指定で小数の見た目をそろえる

printf("小数2桁     : [%.2f]\n", 98.7654);

金額や平均値などは、桁数をそろえたほうが読みやすくなります。
%.2f は実務でもとてもよく使います。

よくあるミスと注意点

フィールド幅は最小幅だと忘れる

%3d と書いても、値が 10000 のように長ければ切り詰められません。
フィールド幅は「最小でもこれだけ確保する」という意味です。

0埋めと左詰めを混同する

  • %05d は右詰めで0埋め
  • %-5d は左詰めで空白埋め

ここは見た目が似ていて混ざりやすいので、何度か試すと覚えやすいです。

精度指定の意味が型で変わる

  • %.2f → 小数点以下2桁
  • %.5s → 文字列の先頭5文字

同じ .数字 でも、f と s で意味が違います。
最初は少しややこしく感じますが、使ううちに自然に慣れます。

実践問題

次の実行結果例のようになるように、空欄を埋めてプログラムを完成させてください。
printf のフィールド幅、フラグ、精度を使って表示を整えてみましょう。

問題

#include <stdio.h>

int main(void)
{
    printf("右詰め6桁      : [ ① ]\n", 58);
    printf("左詰め6桁      : [ ② ]\n", 58);
    printf("符号付き表示    : [ ③ ]\n", 58);
    printf("0埋め6桁       : [ ④ ]\n", 58);
    printf("16進数(明示)  : [ ⑤ ]\n", 58);
    printf("幅8・小数2桁    : [ ⑥ ]\n", 45.6789);
    printf("小数点以下3桁   : [ ⑦ ]\n", 45.6789);
    printf("先頭4文字       : [ ⑧ ]\n", "sample");

    return 0;
}

実行結果例

右詰め6桁      : [    58]
左詰め6桁      : [58    ]
符号付き表示    : [+58]
0埋め6桁       : [000058]
16進数(明示)  : [0x3a]
幅8・小数2桁    : [   45.68]
小数点以下3桁   : [45.679]
先頭4文字       : [samp]

解答例

ファイル名:5_6_2.c

#include <stdio.h>

int main(void)
{
    printf("右詰め6桁      : [%6d]\n", 58);
    printf("左詰め6桁      : [%-6d]\n", 58);
    printf("符号付き表示    : [%+d]\n", 58);
    printf("0埋め6桁       : [%06d]\n", 58);
    printf("16進数(明示)  : [%#x]\n", 58);
    printf("幅8・小数2桁    : [%8.2f]\n", 45.6789);
    printf("小数点以下3桁   : [%.3f]\n", 45.6789);
    printf("先頭4文字       : [%.4s]\n", "sample");

    return 0;
}

解説

この問題は、printf の整形指定をひととおり練習できる内容です。

① 右詰め6桁

%6d

整数を幅6で右詰め表示します。
58 は2桁なので、前に空白が4つ入ります。

② 左詰め6桁

%-6d
  • フラグを付けることで左詰めになります。
    後ろに空白が入ります。

③ 符号付き表示

%+d

正の数にも + が付きます。
差分や増減の表示で便利です。

④ 0埋め6桁

%06d

幅6で、空白の代わりに0で埋めます。
連番や番号表示でよく使います。

⑤ 16進数(明示)

%#x

フラグで 0x が付くので、16進数だとわかりやすくなります。

⑥ 幅8・小数2桁

%8.2f
  • 全体幅:8
  • 小数点以下:2桁

45.6789 は丸められて 45.68 になります。

⑦ 小数点以下3桁

%.3f

小数点以下3桁で表示するので、45.6789 は 45.679 に丸められます。

⑧ 先頭4文字

%.4s

文字列の先頭から4文字だけ表示します。
sample なら samp になります。

表示を整える力は、そのまま読みやすいプログラムにつながる

printf の整形表示は、最初は少し記号が多く見えるかもしれません。
でも、使えるようになると出力の見た目が一気に良くなります。

  • 数字がそろって見やすい
  • 小数の桁数がそろう
  • 表示の意味がすぐ伝わる
  • デバッグ結果を確認しやすい

特に学習中は、printf を「確認用の道具」としてたくさん使うので、整形指定を覚えておくと本当に便利です。
まずは %5d、%-5d、%05d、%.2f、%8.2f あたりを何度か試してみると、感覚がつかみやすくなります。