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

先頭へ戻る

printf関数

概要 標準出力へ、変換指定に沿って変換された文字列を出力する。
ヘッダ stdio.h
形式 int printf(const char* 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 は大文字に変換する。
f または F 符号付き 10進浮動小数点数
e 符号付き 10進浮動小数点数。科学的記数法で出力され、区切りに当たる e は小文字になる。
E 符号付き 10進浮動小数点数。科学的記数法で出力され、区切りに当たる e は大文字になる。
g f または e を指定した際の変換結果のうち、短い方を採用する
G F または E を指定した際の変換結果のうち、短い方を採用する
a 符号付き 16進浮動小数点数。a-f は小文字に変換する。C99規格で追加された。
A 符号付き 16進浮動小数点数。a-f は大文字に変換する。C99規格で追加された。
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", precision, num ); のように指定し、この場合、変数num の値を "%d" で変換しようとし、その際の精度には、変数precision の値が使用される。フィールド最小幅指定にも * を指定していた場合には、フィールド最小幅、精度、変換対象 の順番で実引数を消費する。
精度の指定の直後には、変換修飾子を指定しても良い。これには以下のものがある。これらの指定は、変換指定子が n の場合には、対応する実引数が、どのような型へのポインタであるかを指示するという意味になる。
l 整数を変換する際、対象の型が long型または unsigned long型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が long* であることを指示する。
文字を変換する場合(変換指定子が c)は、wint_t型であることを指示し、文字列を変換する場合(変換指定子が s)は、wint_t* であることを指示する。
ll C99規格で追加された。
整数を変換する際、対象の型が long long型または unsigned long long型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が long long* であることを指示する。
h 整数を変換する際、対象の型が short型または unsigned short型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が short* であることを指示する。
hh C99規格で追加された。
整数を変換する際、対象の型が char型または unsigned char型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が signed char* であることを指示する。
L 浮動小数点数を変換する際、対象の型が long double型であることを指示する。
j C99規格で追加された。
整数を変換する際、対象の型が intmax_t型または uintmax_t型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が intmax_t* であることを指示する。
z C99規格で追加された。
整数を変換する際、対象の型が size_t型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が size_t* であることを指示する。
t C99規格で追加された。
整数を変換する際、対象の型が ptrdiff_t型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が ptrdiff_t* であることを指示する。

変換修飾子の直後には、変換指定子が来る。これは省略できない。
引数format の中で、以上のような変換ルールと合致しない部分はそのまま出力される。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、余分に指定されている場合には、評価は行われるが、printf関数としては無視する。
使用例
#include <stdio.h>

int main(void)
{
    short n;

#if 0
    /* VisualStudio では %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 );

    return 0;
}

実行結果:

simple string
123,  abcde
00000123,     abcde
123     ,     abcde
     123
12.35
12.35
abcde
5
関連 任意のストリームに対して同様の変換指定を行い出力するには、fprintf関数を使う。変換結果を文字の配列に格納するには sprintf関数を使う。
引数に ... ではなく、va_list を使う vprintf関数がある。
ワイド文字版の wprintf関数がある。
解説章 第2章


参考リンク

更新履歴

'2018/4/22 解説中で C95 を(C89 に対して)特別扱いしないように修正。そもそもC言語編は C95ベースなので、余計な説明は省く。

'2018/4/8 「戻り値」の内容を修正。

'2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

'2018/2/1 C言語編全体で表記を統一するため、「フォーマット指定」を「変換指定」に、 「変換指定文字」を「変換指定子」に改めた。

'2018/1/22 新規作成。





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

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

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

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS