C言語で画面に値を表示したいときに最初に覚える関数がprintf
です。
書式指定子(例:%dや%s)を使って、整数や文字列などを自在に整形しながら出力できます。
本記事では、標準出力の基礎から最小サンプル、基本的な使い方、整形のコツ、つまずきやすいミスと対処まで、初心者の方が段階を踏んで理解できるように解説します。
C言語のprintf()とは?基本構文
printf
は標準ライブラリstdio.h
で提供される出力用関数で、コンソール(標準出力)に文字列を表示します。
文字列中にある%
で始まる書式指定子に、後続の引数を当てはめて整形します。
最初に書式(フォーマット)のテンプレートを与え、次に表示したい値を順番に渡すのが基本形です。
標準出力(stdout)の概要
標準出力stdout
は、プログラムがテキストを外部へ出すためのデフォルトの出力先です。
通常はコンソール画面に表示されますが、リダイレクトすればファイルなどに書き出すこともできます。
標準出力は環境によってはバッファリング(一時的な貯め込み)が行われ、改行\n
で区切ると即時に表示されやすいという性質があります。
最小サンプル(Hello, World!)
まずは最小のサンプルでprintf
のイメージを掴みます。
文字列リテラルをprintf
に渡し、最後に改行\n
を付けるのが定番です。
#include <stdio.h> // printfの宣言が含まれる標準入出力ヘッダ
int main(void) {
// 画面に文字列を表示し、行末で改行します
printf("Hello, World!\n");
return 0; // 正常終了
}
Hello, World!
#include<stdio.h>とmain()の位置づけ
#include <stdio.h>
はprintf
など入出力関数の宣言を使えるようにするために必須です。
宣言がないとコンパイル時に警告やエラーになったり、未定義動作の原因になります。
また、main
関数はCプログラムのエントリーポイント(最初に実行される関数)です。
この中でprintf
を呼び出して画面表示を行います。
printfの使い方(基本)
書式文字列中に「そのまま表示したい文字」と「書式指定子」を混在させ、後続の引数で値を渡すのが使い方の基本です。
ここから最もよく使う指定子を順に見ていきます。
改行(\n)の書き方
行を区切るにはエスケープシーケンス\n
を入れます。
改行を入れると表示が行単位で整い、バッファリングの都合でも即時に見えやすくなります。
#include <stdio.h>
int main(void) {
printf("1行目\n");
printf("2行目\n"); // \nがあるので次の行から表示されます
return 0;
}
1行目
2行目
文字列を表示する(%s)
%s
はヌル終端(末尾に\0
)の文字列を表示します。
文字列リテラルやchar*
、char
配列に使います。
#include <stdio.h>
int main(void) {
const char *name = "Alice"; // 文字列リテラル(読み取り専用領域)
char city[] = "Tokyo"; // 配列としての文字列
printf("name: %s\n", name);
printf("city: %s\n", city);
return 0;
}
name: Alice
city: Tokyo
整数を表示する(%d)
%d
は符号付き10進整数(int
)を表示します。
桁幅や0埋めなどの整形は後述のフォーマット指定で行えます。
#include <stdio.h>
int main(void) {
int year = 2025;
int temp = -3;
printf("year: %d\n", year);
printf("temp: %d\n", temp);
return 0;
}
year: 2025
temp: -3
文字を表示する(%c)
%c
は1文字(char
)を表示します。
シングルクォートで文字定数を書きます。
#include <stdio.h>
int main(void) {
char grade = 'A'; // 1文字は' 'で囲む
printf("grade: %c\n", grade);
return 0;
}
grade: A
小数を表示する(%f)
%f
は浮動小数点数(double
)を表示します。
関数呼び出し時にfloat
は自動でdouble
に拡張されるため%f
で問題ありません。
小数点以下の桁数は後述の%.2f
のように調整できます。
#include <stdio.h>
int main(void) {
double pi = 3.1415926535;
printf("pi: %f\n", pi); // 既定では6桁表示
return 0;
}
pi: 3.141593
複数の値を一度に表示
書式指定子の並び順と引数の順番は必ず一致させます。
種類が混在していても構いません。
#include <stdio.h>
int main(void) {
const char *name = "Bob";
int age = 25;
double height = 172.8;
// %s → name, %d → age, %.1f → height の順に対応
printf("%sは%d歳です。身長は%.1fcmです。\n", name, age, height);
return 0;
}
Bobは25歳です。身長は172.8cmです。
文字列と数値を混在させる
文章の中に値を自然に埋め込みたい場合、固定の文字列と書式指定子を混ぜてテンプレートを作ると見やすくなります。
#include <stdio.h>
int main(void) {
const char *item = "Apple";
int price = 150;
printf("商品: %s / 価格: %d円\n", item, price);
return 0;
}
商品: Apple / 価格: 150円
よく使うエスケープ(\t, “, \)
エスケープシーケンスは「そのまま書くと意味を持つ記号」を表現する手段です。
タブ\t
、ダブルクォート"
、バックスラッシュ\
が頻出です。
#include <stdio.h>
int main(void) {
printf("col1\tcol2\tcol3\n"); // \tでタブ区切り
printf("He said, \"Hello\".\n"); // \"で"を表示
printf("Path: C:\\Windows\\System32\n"); // \\で\を表示
return 0;
}
col1 col2 col3
He said, "Hello".
Path: C:\Windows\System32
見やすく整形するフォーマット
桁幅、左寄せ、0埋め、符号表示、精度などを組み合わせると、表のようにそろった出力が可能です。
ここでは最小限の頻出パターンを紹介します。
幅と桁数を指定する(%5d, %-6s)
幅(最小表示桁数)は%5d
のように指定し、左寄せは-
フラグです。
数値は既定で右寄せ、文字列は幅内に収まらなければはみ出して表示されます。
#include <stdio.h>
int main(void) {
printf("[%5d]\n", 42); // 幅5、右寄せ
printf("[%-6s]\n", "cat"); // 幅6、左寄せ
printf("[%5d]\n", 123456); // 幅を超えた場合はそのまま全部表示
return 0;
}
[ 42]
[cat ]
[123456]
0埋めと符号表示(%05d, %+d)
数値をゼロで左側埋めするには0
フラグ、正数にも符号を付けるには+
フラグを使います。
桁幅と併用すると見た目がそろいます。
#include <stdio.h>
int main(void) {
printf("[%05d]\n", 42); // 5桁で0埋め -> 00042
printf("[%+d]\n", 42); // 正数にも+を付与 -> +42
printf("[%+d]\n", -42); // 負数はそのまま-42
return 0;
}
[00042]
[+42]
[-42]
小数点以下の桁数(%.2f)
小数の表示桁数は%.Nf
で指定し、四捨五入されます。
幅と精度を組み合わせる%8.2f
のような書き方もよく使います。
#include <stdio.h>
int main(void) {
double x = 3.14159;
printf("[%.2f]\n", x); // 小数点以下2桁
printf("[%8.2f]\n", x); // 全体幅8、うち小数点以下2桁
return 0;
}
[3.14]
[ 3.14]
以下に、今回触れた一部の指定の早見表を示します。
指定 | 意味 | 例 |
---|---|---|
%s | 文字列 | “%s” |
%d | 符号付き10進整数 | “%5d”, “%+d”, “%05d” |
%c | 1文字 | “%c” |
%f | 浮動小数点(double) | “%.2f”, “%8.2f” |
– | 左寄せフラグ | “%-6s” |
0 | 0埋めフラグ | “%05d” |
+ | 符号表示フラグ | “%+d” |
フラグ、幅、精度、型指定子の順で並ぶのが基本形(例:%[フラグ][幅][.精度]型
)です。
つまずきやすいミスと対処
コンパイルは通っても、書式と型の不一致などは未定義動作に直結します。
ここでは初心者がよく遭遇する落とし穴を実例で確認します。
書式指定子と型の不一致
指定子と引数の型が合わないと結果が壊れたりクラッシュの原因になります。
整数に%f
、小数に%d
などは厳禁です。
#include <stdio.h>
int main(void) {
int n = 10;
double pi = 3.14;
// NG例: 型不一致 (未定義動作)
// printf("n=%f, pi=%d\n", n, pi);
// OK例: 指定子を型に合わせる
printf("n=%d, pi=%.2f\n", n, pi);
return 0;
}
n=%d, pi=%.2f
上の出力は実行時に正しく置き換わりn=10, pi=3.14のように表示されます(コメントのNG行は外さないでくださいという意味ではなく、あくまで例示です)。
ダブルクォートと文字列
文字列はダブルクォート"..."
、1文字はシングルクォート'A'
です。
%s
に'A'
を渡す、%c
に"A"
を渡す、といった取り違えに注意。
#include <stdio.h>
int main(void) {
char ch = 'A';
const char *str = "A";
// NG例 (コメントアウト)
// printf("%s\n", ch); // %sはchar*を期待する
// printf("%c\n", str); // %cはint(文字)を期待する
// OK例
printf("%c %s\n", ch, str);
return 0;
}
A A
セミコロン忘れやバックスラッシュ
文末のセミコロン;
の付け忘れはコンパイルエラーの定番です。
また、\
はエスケープに使う特別な記号なので、そのまま表示したいときは\
と2回書きます。
行末に単独の\
を書くと行継続となり、予期せぬエラーを誘発します。
#include <stdio.h>
int main(void) {
// NG例 (コメントアウト): セミコロン忘れ
// printf("Hello\n")
// OK例
printf("C:\\Users\\Public\\\n"); // \を表示したいときは\\
return 0;
}
C:\Users\Public\
改行なしで出力が出ない場合
プロンプトなどで\n
を付けないと、標準出力のバッファに溜まったまま画面に出ないことがあります。
その場合はfflush(stdout)
で明示的にフラッシュします。
#include <stdio.h>
int main(void) {
printf("入力してください: "); // 改行なし
fflush(stdout); // ここで表示を確定させる
// ... ここでユーザー入力を待つ処理などを書く想定
return 0;
}
入力してください:
一般的にメッセージの末尾に\n
を付ける、もしくは必要に応じてfflush(stdout)
を呼ぶと覚えておくと安全です。
まとめ
printf
は「書式文字列」と「値」を組み合わせて、画面に整った情報を表示するための基本関数です。
本記事では%s
、%d
、%c
、%f
などの主要な書式、改行\n
やエスケープ、幅や精度の指定、0埋めや符号表示、さらに型不一致や引用符の取り違え、バッファリングへの対処といった実務で必須のポイントを一通り確認しました。
まずは小さなサンプルで確実に動かし、幅・精度・フラグを少しずつ組み合わせて「見やすい出力」を作る練習をしてください。
そうすることで、後のデバッグやログ出力、レポート生成の生産性が大きく向上します。