この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:atom
更新日時:2026-06-12 15:50:07

タイトル: printf 標準入出力関数
SEOタイトル: C/C++のprintfの使い方|書式指定子と幅・精度の指定

printfは、C言語由来の書式付き標準出力関数で、書式文字列の中に「変換指定子」を埋め込み、後続の引数を整形して標準出力(画面)へ書き出します。整数・浮動小数点数・文字列など型ごとに指定子を使い分け、幅・精度といった整形も一括で指定できるのが特徴です。C++では<cstdio>をインクルードすることで利用でき、C時代から続く定番の出力手段ですが、現在のC++では型安全なstd::coutstd::format(C++20)の利用が推奨される場面が多くあります。

この記事の要点
  • printfはC言語由来の書式付き標準出力関数で、C++では<cstdio>をインクルードして使う。
  • 書式文字列に%d(整数)・%f(浮動小数点)・%s(文字列)などの変換指定子を埋め込み、引数を整形して出力する。
  • %5d(幅)や%.2f(精度)、%-10s(左寄せ)のように幅・精度・桁揃えを細かく指定できる。
  • 改行は自動では入らないため、改行が必要なら書式文字列に\nを含める。
  • C++では型安全なstd::coutstd::format(C++20)が推奨されることが多い。
  • 変換指定子と引数の型が一致しない場合の動作は未定義であり、特にstd::string%sへ直接渡せない点に注意する。

 

printfとは

printfは、C言語の標準ライブラリに含まれる書式付き出力関数で、C++からも<cstdio>ヘッダ(C言語の<stdio.h>に相当)を通じて利用できます。「print formatted(書式付きで出力する)」が名前の由来で、第1引数の書式文字列に出力したいテキストと変換指定子を記述し、第2引数以降に整形対象の値を並べて渡します。

printfは指定子の数だけ任意個の引数を受け取れる「可変引数関数」であり、書式文字列に書かれた指定子の順番どおりに後続の引数が割り当てられます。出力先は標準出力(通常はコンソール画面)で、改行は自動的には付与されません。

#include <cstdio>

int main() {

    int age = 25;

    printf("年齢は%d歳です\n", age);

    return 0;

}

上の例では、書式文字列中の%dが引数ageの値(25)に置き換えられ、「年齢は25歳です」と改行付きで出力されます。

 

書式指定子(変換指定子)一覧

書式文字列の中で%から始まる記号を変換指定子と呼び、対応する引数をどの型として解釈し、どう整形するかを指定します。代表的な指定子を以下にまとめます。

指定子 対象の型 意味 出力例
%d int 10進整数 42
%f double 浮動小数点数 3.141593
%s char*(C文字列) 文字列 Hello
%c int(文字) 1文字 A
%x unsigned int 16進数(小文字) 2a
%p void* ポインタ(アドレス) 0x7ffd...
%% %記号そのものを出力 %

%fに対してはdouble型を渡します(floatを渡しても可変引数の規則でdoubleに昇格されます)。%%は引数を消費せず、書式文字列の中にパーセント記号そのものを出力したいときに使います。

#include <cstdio>

int main() {

    printf("%d %f %s %c %x %%\n", 42, 3.14, "abc", 'A', 255);

    return 0;

}

出力結果は「42 3.140000 abc A ff %」となります。

 

幅・精度・桁揃えの指定

変換指定子は%と型文字の間にフラグ・幅・精度を挟むことで、出力の体裁を細かく調整できます。書式は%[フラグ][幅][.精度]型の順に並べます。

指定 意味 例(入力) 出力(_は空白)
%5d 最小幅5。足りない分は左側を空白で埋める(右寄せ) 42 ___42
%-5d 最小幅5で左寄せ 42 42___
%05d 最小幅5。足りない分を0で埋める 42 00042
%.2f 小数点以下の桁数を2桁に丸める 3.14159 3.14
%8.2f 全体幅8・小数2桁 3.14159 ____3.14
%-10s 幅10で文字列を左寄せ abc abc_______

幅は「最小幅」であり、値がその幅より長い場合は切り詰められずそのまま出力されます。精度(.以降)は浮動小数点では小数桁数を、文字列では出力する最大文字数を意味します。表組みのように桁を揃えて出力したいときに便利です。

 

改行の扱い

printfは出力後に改行を自動では付けません。改行したい場合は書式文字列の中に改行を表すエスケープシーケンス\nを明示的に含めます。複数回printfを呼ぶ場合、\nを入れ忘れると出力が一行につながってしまうため注意が必要です。

printf("1行目\n");

printf("2行目\n");

 

C++では std::cout や std::format が推奨される

printfはC由来の関数で今もC++で利用できますが、現代的なC++では出力にstd::cout<iostream>)や、C++20で追加されたstd::format<format>)を使うことが推奨される場面が多くあります。これらは引数の型をコンパイラが認識するため、printfで起こりがちな「指定子と引数の型の食い違い」が原理的に発生しにくいという利点があります。

#include <iostream>

#include <string>

int main() {

    int age = 25;

    std::string name = "Taro";

    std::cout << name << " is " << age << std::endl;

    return 0;

}

std::coutでは<<演算子で値を連結し、型ごとの指定子を書く必要がありません。std::stringもそのまま渡せます。C++20以降であれば、printfに近い書式文字列の感覚を保ちつつ型安全なstd::formatも選べます。

#include <format>

#include <iostream>

int main() {

    std::cout << std::format("{} is {}\n", "Taro", 25);

    return 0;

}

 

printf と std::cout の比較

観点 printf std::cout
必要なヘッダ <cstdio> <iostream>
出自 C言語由来 C++の標準ライブラリ
型の扱い 指定子で明示。型不一致は未定義動作 型をコンパイラが認識(型安全)
記述スタイル 書式文字列+可変引数 <<演算子で連結
std::string 直接渡せない(.c_str()が必要) そのまま渡せる
書式整形 幅・精度を簡潔に書ける マニピュレータ等で指定(やや冗長)

printfは書式文字列だけで桁揃えを簡潔に書ける一方、std::coutは型安全でstd::stringもそのまま扱えます。用途や保守性に応じて使い分けるとよいでしょう。

 

落とし穴と注意点

注意点 内容
指定子と引数の型の不一致 %ddoubleを渡すなど、変換指定子と引数の型が一致しない場合の動作は未定義動作です。コンパイルが通っても誤った値の出力やクラッシュにつながることがあるため、指定子と引数の型は必ず対応させます。
std::string を %s に直接渡せない %sはC文字列(char*)を期待するため、C++のstd::stringをそのまま渡すと未定義動作になります。printfで使うならstr.c_str()でC文字列を取り出して渡します。
引数の個数や順序の誤り 指定子の数より引数が少ない場合の動作も未定義です。書式文字列を書き換えた際は、指定子と引数の対応が崩れていないか確認します。
改行の付け忘れ printfは改行を自動付与しないため、行を分けたい場合は\nを明示します。入れ忘れると出力が一行に連結されます。

 

よくある質問(FAQ)

Q. C++でprintfを使ってもよいですか。
A. 使えます。<cstdio>をインクルードすれば問題なく動作します。ただし型安全性やstd::stringの扱いやすさの点から、新規のC++コードではstd::coutstd::format(C++20)が選ばれることも多くなっています。用途に応じて選択してください。

Q. 整数を0埋めして桁を揃えるには。
A. 幅指定の前に0を付けます。たとえば%05dとすると、5桁に満たない部分が0で埋められ、42は「00042」と出力されます。

Q. %記号そのものを出力したいときは。
A. %%と2つ重ねて書きます。これは引数を消費せず、出力にはパーセント記号が1つ表示されます。