トラック4・🚪はじめてのC

printfで画面に出す——書式指定の基本

読む目安 約12分・ゴール:書式指定子とエスケープシーケンスを使い分け、思いどおりの形で値を表示できる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

printf は print formatted——「書式を指定して出力する」という名前です。文字を出すだけでなく、数値を好きな形に整えて表示できます。ここを押さえると、プログラムの結果が一気に読みやすくなります。

書式指定子——値の差し込み口

#include <stdio.h>

int main(void) {
    int nin = 4;
    double kin = 1250.5;
    printf("%d人で%.1f円です\n", nin, kin);
    return 0;
}

出力は 4人で1250.5円です です。%d や %.1f が書式指定子で、後ろに並べた値がこの位置へ順番に差し込まれます(変数そのものは次のトラックで詳しくやります)。主なものは次のとおりです。

・%d … 整数(int)
・%f … 小数(double)。%.2f なら小数点以下2桁
・%c … 1文字(char)
・%s … 文字列
・%% … % という記号そのもの

エスケープシーケンス——見えない文字を書く

改行やタブは、文字列の中に直接は書けません。そこで \ で始まる合図を使います。これがエスケープシーケンスです。

#include <stdio.h>

int main(void) {
    printf("名前\t点数\n");
    printf("さくら\t92\n");
    printf("引用符は \" 、区切り記号は \\ です\n");
    return 0;
}

\n が改行、\t がタブ(桁揃え)、\" が引用符そのもの、\\ がバックスラッシュ(日本語環境では ¥ に見えます)です。

桁を揃える

#include <stdio.h>

int main(void) {
    printf("%5d円\n", 120);
    printf("%5d円\n", 8400);
    printf("[%-8s][%8s]\n", "left", "right");
    return 0;
}

%5d は5桁分の幅を確保して右詰め、%-8s は8桁で左詰めです。数字の桁が揃うだけで、結果はぐっと読みやすくなります。

罠・注意

指定子と値の型がずれると壊れる。 %d に小数を渡す、%f に整数を渡すといった不一致は、でたらめな数値が出たり、そのまま異常終了したりします。多くはコンパイラが警告してくれるので、警告は必ず読みます。

個数が合わない。 %d が2つあるのに値が1つだと、存在しない場所の値を読みにいきます。運が悪いと落ちます。

% を出したいときは %%。 printf("100%\n") は正しく動きません。

改行し忘れ。 出力が1行につながって見えるときは、まず \n の有無を確認します。

ビット\n を付けるか付けないかは、レシートの改行を決めるのと同じ。わざと付けずに、あとから続きを足すのもアリだよ。

まとめ

printf は「書式の文字列」+「差し込む値」の順に書きます。%d 整数、%f 小数、%c 文字、%s 文字列。\n 改行、\t タブ、%% と \\ は記号そのもの。型と個数が合っているかは、書いた直後に必ず数えます。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

このプログラムの出力はどれですか(/は改行を表します)。

#include <stdio.h>

int main(void) {
    int nin = 3;
    double kin = 1234.5;
    printf("%d人で%.1f円\n", nin, kin);
    printf("達成率100%%\n");
    return 0;
}
  1. 3人で1234.5円/達成率100%
  2. 3人で1234.500000円/達成率100%%
  3. %d人で%.1f円/達成率100%%
  4. 3人で1234.5円/達成率100%%
答えを見る

正解:A(3人で1234.5円/達成率100%)

%d に nin の 3、%.1f に kin が小数第1位で差し込まれます(%f のままなら 1234.500000 でした)。%% は「%という記号そのもの」を表す書き方なので、表示は 100% の1文字分です。

確認問題 2

トレース表の空欄を埋めてください。その行が何も表示しないときは (なし) と書きます。

#include <stdio.h>

int main(void) {
    int a = 3;
    printf("%d\n", a);
    a = a * 2;
    printf("[%d]\n", a);
    return 0;
}
行aこの行の出力
43(なし)
533
6?(なし)
76?
答えを見る

空欄の答え(上から順に):6、[6]

6行目 a = a * 2; は右辺 3 * 2 を先に計算して 6 を a に入れます(表示はしません)。7行目の書式は [%d] なので、角括弧ごと [6] と出ます。書式の文字列に書いたものは、そのまま画面に出るのが基本です。

「はじめてのC」の目次

  1. 開発環境ゼロで始める——このポータルの使い方
  2. Hello, World! を解剖する
  3. main関数と#include
  4. コンパイルエラーと友達になる
  5. printfで画面に出す——書式指定の基本
  6. scanfで入力を受け取る
  7. scanfの罠——入力の恐怖を越える
  8. コメントとコードの整え方

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版