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 は大文字に変換する
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 の値が使用される。フィールド最小幅指定にも * を指定していた場合には、フィールド最小幅、精度、変換対象 の順番で実引数を消費する。

精度の指定の直後には、変換修飾子を指定しても良い。これには以下のものがある。これらの指定は、変換指定子が n の場合には、対応する実引数がどのような型へのポインタであるかを指示するという意味になる。

変換修飾子 意味
l 整数を変換する際、対象の型が long型または unsigned long型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が long* であることを指示する。
文字を変換する場合(変換指定子が c)は、wint_t型であることを指示し、文字列を変換する場合(変換指定子が s)は、wint_t* であることを指示する。
浮動小数点数を変換する場合は、特に意味を変えることはない。
ll 整数を変換する際、対象の型が long long型または unsigned long long型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が long long* であることを指示する。
h 整数を変換する際、対象の型が short型または unsigned short型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が short* であることを指示する。
hh 整数を変換する際、対象の型が char型または unsigned char型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が signed char* であることを指示する。
L 浮動小数点数を変換する際、対象の型が long double型であることを指示する。
j 整数を変換する際、対象の型が intmax_t型または uintmax_t型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が intmax_t* であることを指示する。
z 整数を変換する際、対象の型が size_t型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が size_t* であることを指示する。
t 整数を変換する際、対象の型が ptrdiff_t型であることを指示する。 また、変換指定子が n の場合は、対応する実引数の型が ptrdiff_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章


参考リンク


更新履歴

≪さらに古い更新履歴を展開する≫



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

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

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

Programming Place Plus のトップページへ



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