C言語の基本|printfで整数を表示する

文字と整数を組み合わせれば、表示できる情報がもっと豊かになる。printfの%dを使って、数値表示の基本を身につけよう。

これまでprintfを使って、画面に文字を表示する方法を学んできました。文字を表示できるようになったら、次は文章の中に整数を入れて表示してみましょう。

プログラムでは、年齢、点数、個数、回数、ページ数、学習時間など、さまざまな数値を扱います。C言語では、printfの文字列内に%dを記述すると、指定した整数を文章の中へ差し込んで表示できます。

たとえば、次のように記述します。

printf("ノートを%d冊用意しました。\n", 4);

実行結果は次のとおりです。

ノートを4冊用意しました。

文字列の中にある%dが整数を表示する位置となり、カンマの右側に書いた4がその場所に表示されています。

最初は、文字列の外側に書いた整数が文章の途中へ入る仕組みを少し不思議に感じるかもしれません。しかし、基本となる形はとてもシンプルです。

この記事では、次の内容を順番に確認していきます。

  • %dの基本的な役割
  • printfの文字列と整数の関係
  • %dに対応する整数の書き方
  • 整数を変更したときの表示結果
  • %dへ簡単な計算式を渡す方法
  • %dを使うときによくある間違い
  • 練習プログラムの作り方

まずは、%dを整数の差し込み位置として覚えましょう。実際に整数を変更しながらプログラムを動かすと、仕組みを理解しやすくなります。

printfの%dとは

%dは、printfを使って整数を10進数で表示するための変換指定子です。

変換指定子という言葉は少し難しく見えますが、この段階では整数を表示する場所を示す目印と考えれば大丈夫です。

次のコードを見てみましょう。

printf("参加者は%d人です。\n", 12);

このprintfは、大きく2つの部分に分けて考えられます。

  • 参加者は%d人です。\nは、画面に表示する文章の形を指定する部分
  • 12は、%dの位置へ渡す整数

実行すると、次のように表示されます。

参加者は12人です。

printfは文字列を先頭から確認し、%dを見つけると、カンマの右側に指定されている整数をその場所に表示します。

この例では、%dと12が対応しています。そのため、%dの位置に12が入り、参加者は12人です。という文章が完成します。

図1:printfの%dに整数が入る仕組み

この図から分かること

%dは、画面にそのまま表示される文字ではありません。整数を表示する場所として働きます。

カンマの右側に書いた12が%dへ渡されると、%dの位置に12が表示されます。%dの前後に書かれている文字と12が組み合わされ、参加者は12人です。という文章になります。

%dを使う基本の形

printfで整数を1つ表示するときは、次の形を基本として覚えましょう。

printf("文章の中に%dを記述する\n", 整数);

それぞれの記述には、次の役割があります。

記述役割
printf指定した内容を画面に表示する
二重引用符表示する文字列の範囲を示す
%d整数を表示する位置を示す
カンマ文字列と整数を区切る
カンマの右側%dに渡す整数を書く
\n表示したあとで改行する
セミコロンprintfの文の終わりを示す

たとえば、次のように記述します。

printf("今日は%d日目です。\n", 3);

実行結果は次のとおりです。

今日は3日目です。

ほかにも、次のような表示ができます。

表示したい内容%dへ渡す整数実行結果
何回目かを表示する1010回目です。
残り時間を表示する30あと30分です。
読んだ本の数を表示する77冊の本を読みました。
得点を表示する85得点は85点でした。

%dは、文章の先頭、途中、後ろのどこにでも配置できます。

printf("%d冊の本を読みました。\n", 7);

printf("得点は%d点でした。\n", 85);

printf("残り時間は%d分です。\n", 30);

大切なのは、%dを置いた位置に、カンマの右側で指定した整数が表示されるという関係です。

数値を変えて表示結果を確認する

%dを使ったprintfでは、文章の形を変えなくても、カンマの右側にある整数を変更するだけで表示結果を変えられます。

最初に、5を指定してみましょう。

printf("練習問題を%d問解きました。\n", 5);

実行結果は次のとおりです。

練習問題を5問解きました。

次に、5を9へ変更します。

printf("練習問題を%d問解きました。\n", 9);

実行結果も次のように変わります。

練習問題を9問解きました。

文字列の内容は同じですが、%dへ渡す整数を変更したため、表示される数値だけが変わりました。

整数は1桁に限られません。2桁や3桁の整数も同じ方法で表示できます。

printf("今月は%dページ読みました。\n", 120);

実行結果は次のとおりです。

今月は120ページ読みました。

整数を表示するプログラムを作成する

今日の読書予定を表示するプログラム

ファイル名:3_6_1.c

// 今日の読書予定を表示するプログラム
#include <stdio.h>

int main(void)
{
    printf("こんにちは。今日の読書予定を表示します。\n");
    printf("技術書を%dページ読む予定です。\n", 12);
    printf("確認問題を%d問解く予定です。\n", 5);
    printf("最初の%d分は復習に使います。\n", 20);

    return 0;
}
実行結果の例
こんにちは。今日の読書予定を表示します。
技術書を12ページ読む予定です。
確認問題を5問解く予定です。
最初の20分は復習に使います。

このプログラムには、4つのprintfがあります。最初のprintfは文字だけを表示し、残りの3つのprintfでは%dを使って整数を表示しています。

文字だけを表示するprintf

printf("こんにちは。今日の読書予定を表示します。\n");

このprintfには%dがありません。そのため、二重引用符の内側に書かれた文字列がそのまま表示されます。

行の最後にある\nによって、表示後に改行されます。

12ページと表示するprintf

printf("技術書を%dページ読む予定です。\n", 12);

文字列の中には%dが1つあります。カンマの右側には12が書かれているため、%dの位置に12が入ります。

技術書を12ページ読む予定です。

ページという単位は%dによって追加されるものではありません。文字列の中にページと記述しているため、12と組み合わされて12ページと表示されます。

5問と表示するprintf

printf("確認問題を%d問解く予定です。\n", 5);

このprintfでは、%dと5が対応しています。

%dの位置には5が表示され、その直後に文字列内の問が続きます。そのため、実行結果は5問となります。

20分と表示するprintf

printf("最初の%d分は復習に使います。\n", 20);

%dには20が渡されています。20は2桁の整数ですが、1桁の整数と同じ方法で表示できます。

このように、%dは桁数を意識せずに整数を表示できます。

数字を文字列へ直接書く場合との違い

数字を含む文章は、%dを使わなくても表示できます。

printf("技術書を12ページ読む予定です。\n");

この書き方では、12が文字列の一部になっています。表示する内容が変わらない場合は、この書き方でも同じ結果を得られます。

一方、%dを使うと次のようになります。

printf("技術書を%dページ読む予定です。\n", 12);

実行結果はどちらも同じです。

技術書を12ページ読む予定です。

ただし、プログラム上での扱い方には違いがあります。

書き方特徴
文字列の中へ数字を直接書く簡単に書けるが、数字も文字列の一部になる
%dを使う文章と整数を分けて指定できる
%dの右側の整数を変更する文章の形を保ったまま表示する数値を変更できる
%dへ計算式を渡す計算して得られた整数を表示できる

たとえば、読むページ数を12から18へ変更する場合、%dを使った書き方では、カンマの右側にある整数を変更します。

printf("技術書を%dページ読む予定です。\n", 18);

実行結果は次のとおりです。

技術書を18ページ読む予定です。

この先で変数を学ぶと、%dの右側へ変数を指定する機会が増えていきます。今は、文章と整数を分けて指定できることを押さえておけば大丈夫です。

%dと整数の個数を合わせる

printfで%dを使うときは、%dの個数と、カンマの右側に指定する整数の個数を合わせることが基本です。

%dが1つの場合は、対応する整数も1つ指定します。

printf("今日は%dページ読みました。\n", 8);

この場合の対応関係は次のとおりです。

確認する項目個数
%d1個
カンマの右側の整数1個

1つのprintfで2つの整数を表示する場合は、%dも2つ必要です。

printf("%d月%d日です。\n", 8, 13);

このコードでは、%dと整数が左から順番に対応します。

%dの位置対応する整数表示される内容
1つ目の%d88月
2つ目の%d1313日

実行結果は次のとおりです。

8月13日です。

カンマの右側に書く整数の順序を入れ替えると、表示結果も変わります。

printf("%d月%d日です。\n", 13, 8);

実行結果は次のとおりです。

13月8日です。

C言語は、13月という内容が日付として正しいかどうかまでは判断しません。1つ目の%dへ13を入れ、2つ目の%dへ8を入れて、そのまま表示します。

図2:複数の%dと整数が対応する順番

この図から分かること

1つのprintfに複数の%dがある場合は、カンマの右側に並べた整数が左から順番に対応します。

1つ目の%dには1つ目の整数が入り、2つ目の%dには2つ目の整数が入ります。そのため、%dの個数だけでなく、整数を並べる順序も確認する必要があります。

最初のうちは、1つのprintfで%dを1つだけ使うと、対応関係を理解しやすくなります。

%dを使うときによくある間違い

%dを使うときは、文字列、カンマ、整数、セミコロンの関係を確認することが大切です。

%dに対応する整数を書き忘れる

次のコードには%dがありますが、対応する整数がありません。

printf("資料を%d枚印刷します。\n");

%dの位置へ表示する整数が指定されていないため、正しい書き方ではありません。コンパイラから警告が表示されることがあり、実行すると予測できない数値が表示されるなど、不正な動作の原因になります。

正しくは、カンマの右側に整数を指定します。

printf("資料を%d枚印刷します。\n", 6);

%dが1つあるため、対応する整数として6を1つ指定しています。

文字列と整数の間のカンマを忘れる

printfの文字列と、%dへ渡す整数の間にはカンマが必要です。

誤った例は次のとおりです。

printf("資料を%d枚印刷します。\n" 6);

文字列と6を区切るカンマがないため、正しくコンパイルできません。

正しくは次のように記述します。

printf("資料を%d枚印刷します。\n", 6);

行末のセミコロンを忘れる

次のコードには、行末のセミコロンがありません。

printf("資料を%d枚印刷します。\n", 6)

C言語では、printfを呼び出す文の終わりにセミコロンが必要です。

printf("資料を%d枚印刷します。\n", 6);

セミコロンを忘れるとコンパイルエラーになります。エラーメッセージが次の行を指している場合でも、その直前にあるprintfの行末を確認してみましょう。

%dの個数と整数の個数が合っていない

次のコードには%dが2つありますが、整数は1つしか指定されていません。

printf("午前に%d問、午後に%d問解きました。\n", 4);

1つ目の%dには4を渡せますが、2つ目の%dへ渡す整数が不足しています。

正しくは、2つの整数を指定します。

printf("午前に%d問、午後に%d問解きました。\n", 4, 3);

実行結果は次のとおりです。

午前に4問、午後に3問解きました。

確認するときは、次の順番で数えると分かりやすくなります。

  • 文字列の中にある%dの個数を数える
  • カンマの右側にある整数の個数を数える
  • %dと整数が同じ個数になっているか確認する
  • 複数ある場合は、左から順番に正しく対応しているか確認する

%dには計算式も指定できる

%dへ渡せるものは、直接書いた整数だけではありません。計算した結果が整数になる式も指定できます。

printf("合計で%dページ読みました。\n", 6 + 4);

printfが表示を行う前に6 + 4が計算されます。その計算結果である10が、%dの位置に表示されます。

合計で10ページ読みました。

2 + 3という式を表示したいわけではなく、その計算結果である5を表示したい場合も、次のように記述できます。

printf("確認したコードは%d本です。\n", 2 + 3);

実行結果は次のとおりです。

確認したコードは5本です。

ほかの簡単な整数計算も指定できます。

計算の種類計算式計算結果
足し算6 + 410
引き算10 - 37
掛け算4 * 312
割り算12 / 34

それぞれをprintfへ指定すると、次のように書けます。

printf("合計で%dページです。\n", 6 + 4);
printf("残りは%d問です。\n", 10 - 3);
printf("全部で%d枚です。\n", 4 * 3);
printf("1人あたり%d個です。\n", 12 / 3);

実行結果は次のとおりです。

合計で10ページです。
残りは7問です。
全部で12枚です。
1人あたり4個です。

ここでは、演算子の詳しい仕組みをすべて覚える必要はありません。%dには整数そのものだけでなく、計算すると整数になる式も指定できると理解しておけば大丈夫です。

ファイルの作成から実行まで

作成したプログラムは、ソースファイルとして保存し、GCCでコンパイルしてから実行します。

Windows 11、VS Code、MinGW-w64のGCCを使用する場合は、次の流れで進めます。

手順操作内容
1ソースファイルを作成する3_6_1.c
2コードを入力して保存するVS Codeで保存
3作業フォルダーへ移動するcd \cwork\chap03
4ソースファイルをコンパイルするgcc 3_6_1.c -o 3_6_1
5コードページをUTF-8へ変更するchcp 65001
6作成したプログラムを実行する3_6_1

コマンドプロンプトでは、次の順番で入力します。

cd \cwork\chap03
gcc 3_6_1.c -o 3_6_1
chcp 65001
3_6_1

それぞれの操作には、次の役割があります。

  • cd \cwork\chap03で、ソースファイルを保存した作業フォルダーへ移動する
  • gcc 3_6_1.c -o 3_6_1で、3_6_1.cをコンパイルする
  • -o 3_6_1で、作成する実行ファイルの名前を3_6_1に指定する
  • chcp 65001で、コマンドプロンプトのコードページをUTF-8へ変更する
  • 3_6_1で、コンパイルによって作成されたプログラムを実行する

ソースコード内の整数を変更した場合は、ファイルを保存したあとに、もう一度コンパイルしてください。ソースファイルを保存しただけでは、すでに作成されている実行ファイルの内容は変わりません。

実践問題で%dの位置を考える

次の結果を表示するプログラムを作成してみましょう。

こんにちは。今日の作業記録を表示します。
ソースコードを5本確認しました。
エラーを3件修正しました。
明日は8問の練習問題に取り組みます。

この問題では、数字になる部分を%dへ置き換えます。

  • 5本の5を%dへ置き換える
  • 3件の3を%dへ置き換える
  • 8問の8を%dへ置き換える
  • %dに対応する整数をカンマの右側へ書く
  • 各printfの行末にセミコロンを書く
  • 各行の最後に\nを書いて改行する

1行目には整数が含まれていないため、文字列だけを表示するprintfで問題ありません。

2行目から4行目では、文章の中で整数に当たる部分を%dへ置き換えます。

表示したい部分文字列内の書き方カンマの右側へ書く整数
5本%d本5
3件%d件3
8問%d問8

実践問題の解答例

今日の作業記録を表示するプログラム

ファイル名:3_6_2.c

// 今日の作業記録を表示するプログラム
#include <stdio.h>

int main(void)
{
    printf("こんにちは。今日の作業記録を表示します。\n");
    printf("ソースコードを%d本確認しました。\n", 5);
    printf("エラーを%d件修正しました。\n", 3);
    printf("明日は%d問の練習問題に取り組みます。\n", 8);

    return 0;
}
実行結果の例
こんにちは。今日の作業記録を表示します。
ソースコードを5本確認しました。
エラーを3件修正しました。
明日は8問の練習問題に取り組みます。

数字になる部分を%dへ置き換える

次のprintfでは、表示したい5本の5に当たる位置へ%dを書いています。

printf("ソースコードを%d本確認しました。\n", 5);

%dに対応する整数は、カンマの右側にある5です。

printfが実行されると、%dの位置に5が入り、その後ろに本という文字が続きます。そのため、5本と表示されます。

%dの後ろへ単位を書く

%dが表示するのは整数です。本、件、問などの単位が自動的に追加されるわけではありません。

単位は、表示したい文章の中に記述します。

printf("エラーを%d件修正しました。\n", 3);

このprintfは、次の内容を順番に組み合わせて表示しています。

  • エラーをという文字
  • %dの位置に入る3
  • 件修正しました。という文字
  • \nによる改行

これらが組み合わされ、次のように表示されます。

エラーを3件修正しました。

数値を変更して確かめる

5を7へ変更すると、表示結果も変わります。

printf("ソースコードを%d本確認しました。\n", 7);

実行結果の該当部分は次のようになります。

ソースコードを7本確認しました。

数値を変更したあとは、次の順番で操作します。

  • VS Codeでソースファイルを保存する
  • GCCでもう一度コンパイルする
  • 作成されたプログラムを実行する
  • 変更した数値が表示されているか確認する

計算式を使った別の書き方

同じ実行結果を、整数の計算式を使って表示することもできます。

計算結果を使って今日の作業記録を表示するプログラム

ファイル名:3_6_3.c

// 計算結果を使って今日の作業記録を表示するプログラム
#include <stdio.h>

int main(void)
{
    printf("こんにちは。今日の作業記録を表示します。\n");
    printf("ソースコードを%d本確認しました。\n", 2 + 3);
    printf("エラーを%d件修正しました。\n", 1 + 2);
    printf("明日は%d問の練習問題に取り組みます。\n", 4 + 4);

    return 0;
}
実行結果の例
こんにちは。今日の作業記録を表示します。
ソースコードを5本確認しました。
エラーを3件修正しました。
明日は8問の練習問題に取り組みます。

このプログラムでは、%dへ整数を直接渡す代わりに、整数の計算式を渡しています。

printfへ渡す計算式計算結果%dの位置に表示される整数
2 + 355
1 + 233
4 + 488

次のprintfでは、2 + 3が先に計算されます。

printf("ソースコードを%d本確認しました。\n", 2 + 3);

2 + 3の計算結果は5です。そのため、%dの位置には5が表示されます。

ソースコードを5本確認しました。

2 + 3という計算式がそのまま画面に表示されるわけではありません。計算によって得られた整数の5が表示される点を押さえておきましょう。

図3:%dへ整数の計算結果を渡す流れ

この図から分かること

%dには、5のような整数を直接渡すだけでなく、2 + 3のような計算式も渡せます。

計算式を指定した場合は、最初に計算が行われます。その結果として得られた5が%dへ渡され、文章の中に表示されます。

整数を直接指定する場合と計算式を指定する場合では、値の用意の仕方が異なります。しかし、最終的に整数が%dの位置へ表示される点は同じです。

自分で練習するときの考え方

%dの使い方に慣れるには、身近な整数を使った短い文章を作るのがおすすめです。

練習には、次のような題材を利用できます。

  • 読んだページ数
  • 解いた問題数
  • 作成したファイル数
  • コンパイルした回数
  • 修正したエラーの件数
  • 学習した時間
  • 明日の予定数

最初に、表示したい文章を考えます。

今日は15ページ読みました。

次に、整数になる15を%dへ置き換えます。

今日は%dページ読みました。

最後に、置き換えた整数をカンマの右側へ指定します。

printf("今日は%dページ読みました。\n", 15);

プログラムを書いたら、次の点を順番に確認しましょう。

  • %dが文字列の中にあるか
  • %dの位置が数字を表示したい場所になっているか
  • %dの後ろにページや問などの単位が書かれているか
  • 文字列の後ろにカンマがあるか
  • カンマの右側に整数が書かれているか
  • %dと整数の個数が一致しているか
  • printfの最後にセミコロンがあるか
  • コードを保存してからコンパイルしたか
  • 整数を変更したあとに再コンパイルしたか

まずは、%dを1つ使った短いprintfを何度か書いてみましょう。8を12へ変更したり、3を5へ変更したりしながら実行結果を見比べると、%dと整数の対応関係が自然に分かるようになります。