C言語のきほん|書式指定を使って表示しよう

同じ数でも、見せ方を変えると意味が伝わりやすくなる。書式指定を使って、printf表示をレベルアップしよう。

C言語で printf を使うと、文字列をそのまま表示できます。
でも、printf の本当の便利さはそこから先にあります。

それが 書式指定(変換指定) です。
書式指定を使うと、整数や文字などの値を、目的に合わせた形で表示できます。

たとえば、同じ 123 という値でも、10進数で表示したり、8進数で表示したり、16進数で表示したりできます。
この機能を使えるようになると、デバッグのときにも、学習中の確認にも、とても役立ちます。

ここでは、printf の書式指定の基本を、特に整数の表示を中心にやさしく整理していきます。
サンプルプログラムは内容を少し変えて、日本語メッセージ・日本語コメントでわかりやすく説明していきます。

printf は文字列だけでなく値も表示できる

まず基本の確認です。
printf は、文字列をそのまま表示するだけなら次のように書けます。

printf("こんにちは\n");

一方、変数の値や数値を埋め込んで表示したいときは、書式指定 を使います。

printf("数値は %d です\n", 123);

この %d のような部分が書式指定です。
書式指定は、% と変換指定子を組み合わせて書きます。

書式指定の基本イメージ

printf の形をイメージで見ると、こんな感じです。

printf("ここに書式指定を書く", 表示したい値);

たとえば、

printf("点数は %d 点です\n", score);

なら、%d の位置に score の値が入って表示されます。

つまり、printf は

  • どんな形で表示するか(書式文字列)
  • 何を表示するか(値)

をセットで指定する関数です。

整数値でよく使う書式指定

今回のテーマでは、整数の表示を中心に使うので、まずはこの3つを押さえれば大丈夫です。

書式指定意味例(値が123のとき)
%d符号付き10進数で表示123
%o8進数で表示173
%x16進数(小文字)で表示7b
%X16進数(大文字)で表示7B

ポイント

  • %d は普段の10進数表示
  • %o は8進数表示
  • %x と %X は16進数表示(英字の大小が違う)

このあたりは、進数の学習とセットで使うと理解が深まります。

同じ値でも表示形式を変えられる

printf の大事なポイントは、値そのものは同じでも、表示形式だけを変えられる ことです。

たとえば、値が 123 でも、

  • %d で表示 → 123
  • %o で表示 → 173
  • %x で表示 → 7b

のように見え方が変わります。

これは、プログラムの中の値が変わったわけではなく、表示のしかたを変えているだけ です。
この考え方は、今後のデバッグやビット操作の理解にもつながります。

サンプルプログラムで確認しよう

ファイル名:5_3_1.c

#include <stdio.h>

int main(void)
{
    /* 表示したい整数値 */
    int number = 26;

    /* 同じ値をいろいろな進数で表示する */
    printf("10進数で表示: %d\n", number);
    printf("8進数で表示 : %o\n", number);
    printf("16進数で表示: %x\n", number);

    /* 1行にまとめて表示する */
    printf("まとめ表示 → 10進:%d\t8進:%o\t16進:%x\n", number, number, number);

    return 0;
}

実行結果例

10進数で表示: 26
8進数で表示 : 32
16進数で表示: 1a
まとめ表示 → 10進:26    8進:32    16進:1a

サンプルプログラムの解説

変数を使って表示している

int number = 26;

今回は値を直接書くのではなく、int型の変数 number に入れています。
こうしておくと、あとで値を変えたくなったときに修正しやすいです。

書式指定に合わせて表示形式が変わる

printf("10進数で表示: %d\n", number);
printf("8進数で表示 : %o\n", number);
printf("16進数で表示: %x\n", number);

ここでは同じ変数 number を使っていますが、書式指定を変えることで表示結果が変わっています。

  • %d → 10進数
  • %o → 8進数
  • %x → 16進数

つまり、printf は「値をどう見せるか」を指定しているわけです。

1つの printf に複数の値を渡せる

printf("まとめ表示 → 10進:%d\t8進:%o\t16進:%x\n", number, number, number);

書式文字列の中に %d、%o、%x が3つあるので、後ろにも値を3つ渡しています。
printf は、左から順番に 書式指定と値を対応させて表示します。

対応のイメージはこんな感じです。

書式指定を使うときの大事なルール

ここはとても大事なので、しっかり押さえておきたいポイントです。

書式指定の数と値の数をそろえる

たとえば、書式指定が2つあるのに値を1つしか渡さないと、正しく動きません。

良い例

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

悪い例

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

書式指定の数と、後ろに渡す値の数は必ずそろえましょう。

型に合った書式指定を使う

今回の %d、%o、%x、%X は整数向けです。
int型の値を表示するときに使います。

たとえば、文字列には %s、小数には %f を使います。
型と書式指定がずれると、表示がおかしくなる原因になります。

%x と %X の違い

どちらも16進数を表示しますが、英字部分の表示が違います。

  • %x → a, b, c, d, e, f(小文字)
  • %X → A, B, C, D, E, F(大文字)

例として、26 を表示すると、

  • %x → 1a
  • %X → 1A

になります。

確認用の例

printf("小文字の16進数: %x\n", 26);
printf("大文字の16進数: %X\n", 26);

表示を整えると読みやすくなる

書式指定は「値を出す」だけでなく、「見やすく整える」ためにも使います。
今回の例では \t を使って横に並べました。

printf("まとめ表示 → 10進:%d\t8進:%o\t16進:%x\n", number, number, number);

このように、エスケープシーケンスの \t と書式指定を組み合わせると、見やすい表示を作りやすくなります。
printf は、表示の実験をしながら覚えるととても身につきやすいです。

よくあるミスと注意点

% と値の順番がずれる

書式指定の順番と、値の順番がずれると意図しない表示になります。

たとえば、書式文字列が

"%d %o %x"

なら、後ろの値もその順番で対応します。
今回は同じ値を3回渡しているので影響が見えにくいですが、別の値を使うときは順番に注意しましょう。

8進数と16進数の表示結果にびっくりする

26 を %o で表示すると 32、%x で表示すると 1a になります。
最初は「値が変わった?」と感じるかもしれませんが、これは表示形式が変わっただけです。

内部の値は同じで、見せ方を変えているだけだと考えると整理しやすいです。

書式指定を文字列として書いてしまう

たとえば、%d をそのまま表示したいなら %% のような書き方が必要ですが、通常は %d は「変換指定」として働きます。
入門の段階では、まず %d は整数表示の合図と覚えておけば十分です。

実践問題

次の実行結果になるように、int型変数 code に初期化した値 31 を printf で表示してみましょう。
10進数、8進数、16進数をそれぞれ表示し、最後に1行でまとめて表示してください。

実行結果例

10進 : 31
8進  : 37
16進 : 1f
10進 : 31    8進 : 37    16進 : 1f

解答例

ファイル名:5_3_2.c

#include <stdio.h>

int main(void)
{
    /* 表示する値を変数に入れる */
    int code = 31;

    /* それぞれの進数で表示する */
    printf("10進 : %d\n", code);
    printf("8進  : %o\n", code);
    printf("16進 : %x\n", code);

    /* 1行にまとめて表示する */
    printf("10進 : %d\t8進 : %o\t16進 : %x\n", code, code, code);

    return 0;
}

解説

この問題のポイントは、同じ変数 code を、書式指定だけ変えて表示している ところです。

  • %d で 10進数表示
  • %o で 8進数表示
  • %x で 16進数表示

31 は進数を変えると次のように見えます。

  • 31(10)
  • 37(8)
  • 1f(16)

最後の1行では、書式指定が3つあるので、後ろにも code を3回書いています。
printf は左から順に対応させるので、このように書けばきれいにまとめて表示できます。

学習を進めるコツ

書式指定は、printf を使いこなすための入口です。
最初は %d、%o、%x だけでも十分ですが、ここが理解できると、後で %f や %c や %s もスムーズに覚えられます。

おすすめの練習は、同じ値をいろいろな書式指定で表示してみることです。
たとえば 10、15、16、31、255 のような値で試すと、進数の変化がわかりやすくて楽しく学べます。