printf | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


printf関数 🔗

概要 標準出力へ、変換指定に沿って変換された文字列を出力する。
ヘッダ stdio.h
形式 int printf(const char* restrict format, …);
引数 format 変換指定を含んだ、あるいは含まないプレーンな文字列。
format に含まれている変換指定子に対応した個数のパラメータ。
戻り値 正常に終了した場合は、出力した文字数が返される。エラー発生時は負数が返される。
詳細

引数format の基本形式は、“%d” や “%s” といった変換指定の開始を意味する %記号と、変換指定子の組み合わせである。この指定の組み合わせ1つにつき、実引数… の個数を1つ増やす。ただし、後述する “%*d” のように、フィールド最小幅指定に * を用いた場合や、“%.*d” のように精度指定に * を用いた場合には、最小幅を指定するための実引数… を1つ追加しなければならない。


変換指定子には以下のものがある。

変換指定子 意味
d または i 符号付き 10進整数
u 符号無し 10進整数
o 符号無し 8進整数
x 符号無し 16進整数。a-f は小文字に変換する
X 符号無し 16進整数。a-f は大文字に変換する
(C23) b または B 符号無し 2進整数
f または F 符号付き 10進浮動小数点数
e 符号付き 10進浮動小数点数。科学的記数法で出力され、区切りに当たる e は小文字になる
E 符号付き 10進浮動小数点数。科学的記数法で出力され、区切りに当たる e は大文字になる
g f または e を指定した際の変換結果のうち、短い方を採用する
G F または E を指定した際の変換結果のうち、短い方を採用する
a 符号付き 16進浮動小数点数。a-f は小文字に変換する
A 符号付き 16進浮動小数点数。a-f は大文字に変換する
c 文字
s 文字列。実引数は文字配列を指すポインタでなければならないから、ヌルポインタを指定することは未定義動作📘
p void*型の実引数に対して、そのメモリアドレスを表現する形に変換する。ヌルポインタでも問題ない
n この変換指定が現れるまでに出力された文字数に変換され、対応する実引数(整数変数へのポインタでなければならない)に格納する。この結果は出力はされない
% “%%” というように 2つ並べることによって、%記号1つに変換される


指定開始文字% の直後には、変換フラグを指定しても良い。変換フラグには以下のものがある。

変換フラグ 意味
- 出力フィールド幅の範囲内で、左寄せする
+ 変換結果が符号付きの数値の場合に、符号を意味する + や - を付ける
空白文字 変換結果が符号付きの数値の場合に、符号を意味する - か、空白文字を付ける
0 出力フィールド幅が余った場合に、0 で埋める
# デフォルトとは異なる代替形式で変換させる。具体的な意味は、変換指定子によって異なり、以下のとおりである。
o の場合: 8進数であることを表す 0 を先頭に付ける。
x の場合: 16進数であることを表す 0x を先頭に付ける。
X の場合: 16進数であることを表す 0X を先頭に付ける。
f、F、e、E、g、G、a、A の場合: 小数点以下の精度が 0 のときでも、小数点を表示する。


変換フラグの指定の直後には、フィールド最小幅を指定しても良い。これは 10進整数で表現され、変換結果が最低でも何文字分の領域を使用するかを指定している。たとえば、“%7d” のように指定する。


この指定はあくまでも最小幅であって、これを超える文字数に変換された場合には、その文字数分だけ出力される。最小幅よりも変換結果の文字数の方が小さい場合には何らかの文字で埋められる。このとき使用される文字は、特に指定しなければ空白文字であるが、変換フラグの 0 を使用していれば、0 で埋められる。


フィールド最小幅の指定を * としても良く、この場合には、引数… の対応する値を調べ、そこに指定されていた整数を最小幅とみなす。たとえば、printf("%*d", length, num); のように指定した場合、変数num の値を “%d” で変換しようとし、その際の最小幅指定として、変数length の値が使用される。


フィールド最小幅の指定の直後には、精度を指定しても良い。これは、小数点と 10進整数で表現される。「精度」が意味するところは、変換指定子によって異なり、以下のとおりである。

変換指定子 意味
d、i、u、o、x、X 数字の最小桁数
f、F、e、E、a、A 小数点以下の桁数
g、G 有効桁数
s 最大文字数


精度の指定を * としても良く、この場合には、引数… の対応する値を調べ、そこに指定されていた整数を最小幅とみなす。たとえば、printf("%*d", recision, num); のように指定し、この場合、変数num の値を “%d” で変換しようとし、その際の精度として、変数precision の値が使用される。フィールド最小幅指定にも * を指定していた場合には、フィールド最小幅、精度、変換対象 の順番で実引数を消費する。


精度の指定の直後には以下の変換修飾子を指定してもよく、このさらに後続に続く変換指定子が、対応する実引数の型をどのように変更するかを指示する。

変換修飾子 続く変換指定子 対応する実引数の型
hh d、i signed char型
b、B、o、u、x、X unsigned char型
n signed char*型
h d、i short型
b、B、o、u、x、X unsigned short型
n short*型
l d、i long型
b、B、o、u、x、X unsigned long型
c wint_t型
s wchar_t*型
n long*型
ll d、i long long型
b、B、o、u、x、X unsigned long long型
n long long*型
j d、i intmax_t型
b、B、o、u、x、X uintmax_t型
n intmax_t*型
z d、i size_t型に対応する符号付き整数型
b、B、o、u、x、X size_t型
n size_t型に対応する符号付き整数型へのポインタ型
t d、i ptrdiff_t型
b、B、o、u、x、X ptrdiff_t型に対応する符号無し整数型
n ptrdiff_t*型
(C23) wN d、i Nビット長の符号付き整数型
b、B、o、u、x、X Nビット長の符号無し整数型
n Nビット長の整数型へのポインタ型
(C23) wfN d、i Nビット長の最速の符号付き整数型
b、B、o、u、x、X Nビット長の最速の符号無し整数型
n Nビット長の最速の整数型へのポインタ型
L a、A、e、E、f、F、g、G long double型
(C23) H a、A、e、E、f、F、g、G _Decimal32型
(C23) D a、A、e、E、f、F、g、G _Decimal64型
(C23) DD a、A、e、E、f、F、g、G _Decimal128型

wN の N は、先頭に 0 が付かない 10進整数を意味する(たとえば w32 のように指定)。<stdint.h> で定義されている最小幅の整数型(int_leastN_t や uint_leastN_t)、あるいは正確な幅の整数型(intN_t、uintN_t)のビット長と一致するものが選択される。該当するものがない場合の結果は処理系定義。

wfN の N は、先頭に 0 が付かない 10進整数を意味する(たとえば wf32 のように指定)。<stdint.h> で定義されている最速の整数型(int_fastN_t や uint_fastN_t)と一致するものが選択される。該当するものがない場合の結果は処理系定義。


変換修飾子の直後には変換指定子が来る。これは省略できない。


引数format の中で、以上の変換ルールと合致しない部分はそのまま出力される。
注意

必要な個数の実引数が指定されていない場合の動作は未定義📘。余分に指定されている場合には、評価📘は行われるが、printf関数としては無視する。


第1引数に変数を指定することには注意を要する。たとえば、printf(s); という呼び出しでは、変数s が “xx%dyy” のような文字列を保持していると、%d が変換指定子とみなされる。その結果、指定していない2つ目の実引数を参照しようとするため、不正なデータを読み取ることになる。
使用例
#include <stdio.h>

int main(void)
{
    short n;

#if 0
    // Visual Studio では %n変換を使う際には、これが必要
    // %n変換は危険性があるので、デフォルトでは無効になっている
    _set_printf_count_output(1);
#endif

    printf("simple string\n");
    printf("%d,  %s\n", 123, "abcde");
    printf("%08d,  %8s\n", 123, "abcde");
    printf("%-8d,  %8s\n", 123, "abcde");
    printf("%*d\n", 8, 123);
    printf("%3.2f\n", 12.34567f);
    printf("%*.*f\n", 3, 2, 12.34567f);
    printf("%s%hn\n", "abcde", &n);
    printf("%hd\n", n);
}

実行結果:

simple string
123,  abcde
00000123,     abcde
123     ,     abcde
     123
12.35
12.35
abcde
5
関連

任意のストリームに対して同様の変換指定を行い出力するには、fprintf関数を使う。変換結果を文字の配列に格納するには sprintf関数を使う。


引数に … ではなく、va_list を使う vprintf関数がある。


ワイド文字版の wprintf関数がある。
解説章 第2章


参考リンク 🔗

本ページはアフィリエイトプログラムによる収益を得ています。
以下のリンクから商品を購入されると、Programming Place 管理者に紹介料が支払われています。


更新履歴 🔗

≪さらに古い更新履歴≫



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る