Namespaces
Variants

printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s

ja.cppreference.net より
< c | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
非書式入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式入力
直接入出力
書式出力
ファイル位置決め
エラーハンドリング
ファイル操作
 
ヘッダ <stdio.h>
int printf( const char* format, ... );
で定義 (1) (C99 まで)
int printf( const char* restrict format, ... );
(C99 以降)
int fprintf( FILE* stream, const char* format, ... );
(2) (C99 まで)
int fprintf( FILE* restrict stream, const char* restrict format, ... );
(C99 以降)
int sprintf( char* buffer, const char* format, ... );
(3) (C99 まで)
int sprintf( char* restrict buffer, const char* restrict format, ... );
(C99 以降)
int snprintf( char* restrict buffer, size_t bufsz,
              const char* restrict format, ... );
(4) (C99 以降)
int printf_s( const char* restrict format, ... );
(5) (C11 以降)
int fprintf_s( FILE* restrict stream, const char* restrict format, ... );
(6) (C11 以降)
int sprintf_s( char* restrict buffer, rsize_t bufsz,
               const char* restrict format, ... );
(7) (C11 以降)
int snprintf_s( char* restrict buffer, rsize_t bufsz,
                const char* restrict format, ... );
(8) (C11 以降)

指定された位置からデータを読み込み、それらを文字列相当に変換し、結果をさまざまな出力先・ストリームに書き込みます。

1) 結果を出力ストリーム stdout に書き込みます。
2) 結果を出力ストリーム stream に書き込みます。
3) 結果を文字列 buffer に書き込みます。書き込まれる文字列(終端のヌル文字を含む)が buffer の指す配列のサイズを超える場合、動作は未定義です。
4) 結果を文字列 buffer に書き込みます。最大 bufsz - 1 文字が書き込まれます。結果の文字列は、bufsz がゼロでない限り、ヌル文字で終端されます。bufsz がゼロの場合、何も書き込まれず、buffer はヌルポインタでも構いませんが、戻り値(ヌル終端を含まない、書き込まれるはずだったバイト数)は依然として計算され返されます。
5-8) (1-4) と同じですが、以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数が呼び出される点が異なります。
  • 変換指定子 %n が format
  • に存在する%s
  • stream に対応する引数のいずれかがヌルポインタであるformat または buffer がヌルポインタである
  • bufsz がゼロまたは RSIZE_MAX
  • より大きい
  • 文字変換指定子および文字列変換指定子のいずれかでエンコードエラーが発生したsprintf_s(buffer の場合のみ)、bufsz に格納される文字列(末尾のヌルを含む)が
を超える。 他の境界チェック関数と同様に、printf_s、fprintf_s、sprintf_s、snprintf_s は、実装が __STDC_LIB_EXT1__ を定義しており、ユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 として <stdio.h> をインクルードする前に定義した場合にのみ利用可能であることが保証されます。

引数

stream - 書き込み先の出力ファイルストリーム
buffer - 書き込み先の文字列へのポインタ
bufsz - 最大 bufsz - 1 文字(ヌル終端を含む)まで書き込まれる可能性がある
format - データの解釈方法を指定する、ヌル終端バイト文字列へのポインタ
... - 出力するデータを指定する引数。デフォルト引数昇格 後の任意の引数が対応する変換指定で期待される型(期待される型は昇格された型または昇格された型と互換性のある型である)でない場合、または format が必要とするよりも引数が少ない場合、動作は未定義です。format が必要とするよりも引数が多い場合、余分な引数は評価され無視されます。

format 文字列は、通常のバイト文字(% を除く)で構成され、そのまま出力ストリームにコピーされます。また、変換指定も含まれます。各変換指定は以下の形式を持ちます。

  • 導入の % 文字。
  • (オプション) 変換の動作を変更する1つ以上のフラグ:
  • -: 変換結果をフィールド内で左詰めにします(デフォルトは右詰め)。
  • +: 符号付き変換の符号は常に変換結果の前に付けられます(デフォルトでは負の場合のみマイナスが付きます)。
  • 空白: 符号付き変換の結果が符号文字で始まらない場合、または空の場合、結果の前に空白が付けられます。+ フラグが存在する場合は無視されます。
  • #: 変換の代替形式 が実行されます。正確な効果については以下の表を参照してください。そうでない場合、動作は未定義です。
  • 0: 整数および浮動小数点数の変換では、フィールドのパディングに 空白 文字の代わりに先頭のゼロが使用されます。整数の場合、精度が明示的に指定されていると無視されます。他の変換でこのフラグを使用すると未定義の動作になります。- フラグが存在する場合は無視されます。
  • (オプション) 最小フィールド幅を指定する整数値または *。結果は、必要に応じて、デフォルトでは 空白 文字で、右詰めの場合は左側に、左詰めの場合は右側にパディングされます。* が使用される場合、幅は int 型の追加引数で指定され、その引数は変換される引数と、精度が指定されている場合はその前に現れます。引数の値が負の場合、- フラグが指定され、フィールド幅は正になります(注: これは最小幅です。値が切り詰められることはありません)。
  • (オプション) . の後に整数または *、あるいはそのどちらも指定しないことで、変換の精度 を指定します。* が使用される場合、精度 は int 型の追加引数で指定され、その引数は変換される引数の前、ただし最小フィールド幅を指定する引数(指定されている場合)の後に現れます。この引数の値が負の場合、無視されます。数値も * も使用されない場合、精度はゼロと見なされます。精度 の正確な効果については以下の表を参照してください。
  • (オプション) 長さ修飾子。引数のサイズを指定します(変換書式指定子と組み合わせて、対応する引数の型を指定します)。
  • 変換書式指定子。

以下の書式指定子が利用可能です。

変換
指定子
説明 期待される
引数の型
長さ修飾子→ hh h なし l ll j z t L
C99 以降のみ→ はい はい はい はい はい
% リテラル % を書き込みます。完全な変換指定は %% でなければなりません。 N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

1文字 を書き込みます。

  • 引数は最初に unsigned char に変換されます。
  • l 修飾子が使用される場合、引数は最初に %ls と wchar_t[2] 引数を使った場合と同様に文字列に変換されます。
N/A N/A
int
wint_t
N/A N/A N/A N/A N/A
s

文字列 を書き込みます。

  • 引数は文字配列の先頭要素へのポインタでなければなりません。
  • 精度 は書き込まれる最大バイト数を指定します。精度 が指定されない場合、最初のヌル終端までのすべてのバイト(ヌル終端は含まない)が書き込まれます。
  • l 指定子が使用される場合、引数は wchar_t の配列の先頭要素へのポインタでなければならず、ゼロ初期化された変換状態で wcrtomb を呼び出したかのように char 配列に変換されます。
N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
d
i

符号付き整数 を10進表現 [-]dddd に変換します。

  • 精度 は表示される最小の桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換結果は文字なしになります。
  • z 修飾子の場合、期待される引数の型は size_t の符号付きバージョンです。
signed char
short
int
long
long long
intmax_t
※
ptrdiff_t
N/A
b
B (オプション)

(C23)

符号なし整数 を2進表現 bbbb に変換します。

  • 精度 は表示される最小の桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換結果は文字なしになります。
  • 代替実装 0b では、変換された値が非ゼロの場合に 0B が結果の前に付加されます。
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
ptrdiff_t
の符号なしバージョンN/A
o

符号なし整数 を8進表現 oooo に変換します。

  • 精度 は表示される最小の桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換結果は文字なしになります。
  • 代替実装 では、必要に応じて先頭のゼロを1つ書くために精度が増やされます。その場合、変換された値と精度の両方が 0 の場合、単一の 0 が書き込まれます。
N/A
x
X

符号なし整数 を16進表現 hhhh に変換します。

  • x 変換の場合は文字 abcdef が使用されます。
  • X 変換の場合は文字 ABCDEF が使用されます。
  • 精度 は表示される最小の桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換結果は文字なしになります。
  • 代替実装 0x では、変換された値が非ゼロの場合に 0X が結果の前に付加されます。
N/A
u

符号なし整数 を10進表現 dddd に変換します。

  • 精度 は表示される最小の桁数を指定します。
  • デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換結果は文字なしになります。
N/A
f
F (C99)

浮動小数点数 を [-]ddd.ddd 形式の10進表記に変換します。

  • 精度 は小数点文字の後に表示される正確な桁数を指定します。
  • デフォルトの精度は 6 です。
  • 代替実装 では、小数点文字は後ろに数字がなくても書き込まれます。
  • 無限大と非数の変換形式については ノート を参照してください。
N/A N/A
double
double (C99)
N/A N/A N/A N/A
long double
e
E

浮動小数点数 を10進指数表記に変換します。

  • e 変換形式では [-]d.ddd e±dd が使用されます。
  • E 変換形式では [-]d.ddd E±dd が使用されます。
  • 指数は少なくとも2桁を含み、必要な場合にのみさらに桁が使用されます。
  • 値が 0 の場合、指数も 0 になります。
  • 精度 は小数点文字の後に表示される正確な桁数を指定します。
  • デフォルトの精度は 6 です。
  • 代替実装 では、小数点文字は後ろに数字がなくても書き込まれます。
  • 無限大と非数の変換形式については ノート を参照してください。
N/A N/A N/A N/A N/A N/A
a
A

(C99)

浮動小数点数 を16進指数表記に変換します。

  • a 変換形式では [-] 0xh.hhh p±d が使用されます。
  • A 変換形式では [-] 0Xh.hhh P±d が使用されます。
  • 引数が正規化された浮動小数点値の場合、最初の16進数字は 0 ではありません。
  • 値が 0 の場合、指数も 0 になります。
  • 精度 は16進小数点文字の後に表示される正確な桁数を指定します。
  • デフォルトの精度は値の正確な表現に十分です。
  • 代替実装 では、小数点文字は後ろに数字がなくても書き込まれます。
  • 無限大と非数の変換形式については ノート を参照してください。
N/A N/A N/A N/A N/A N/A
g
G

浮動小数点数 を、値と 精度 に応じて、10進表記または10進指数表記に変換します。

  • g 変換形式では、e または f 形式での変換が行われます。
  • G 変換形式では、E または f(C99 まで)F(C99 以降) 形式での変換が行われます。
  • P を、精度が非ゼロの場合はその精度、精度が指定されていない場合は 6、精度が 1 の場合は 0 とします。次に、E 形式での変換の指数が X になる場合:
    • P > X ≥ −4 の場合、変換は f または F(C99 以降) 形式、精度 P − 1 − X で行われます。
    • そうでない場合、変換は e または E 形式、精度 P − 1 で行われます。
  • 代替表現 が要求されない限り、末尾のゼロは削除され、また小数部が残っていない場合は小数点文字も削除されます。
  • 無限大と非数の変換形式については ノート を参照してください。
N/A N/A N/A N/A N/A N/A
n

この関数呼び出しでこれまでに書き込まれた文字数 を返します。

  • 結果は引数の指す値に書き込まれます。
  • 指定子には フラグ、フィールド幅、精度 を含めることはできません。
  • z 修飾子の場合、期待される引数の型は S* です。ここで S は size_t の符号付きバージョンです。
signed char*
short*
int*
long*
long long*
intmax_t*
※
 ptrdiff_t* 
N/A
p

ポインタ を定義する実装定義の文字シーケンスを書き込みます。

N/A N/A
void*
N/A N/A N/A N/A N/A N/A
ノート

浮動小数点変換関数は無限大を inf または infinity に変換します。どちらが使用されるかは実装定義です。

非数は nan または nan(char_sequence) に変換されます。どちらが使用されるかは実装定義です。

変換 F、E、G、A は代わりに INF、INFINITY、NAN を出力します。

char、unsigned char、signed char、short、unsigned short を出力するために使用される変換指定子は、デフォルト引数昇格 の昇格された型を期待しますが、その値は出力前に char、unsigned char、signed char、short、unsigned short に変換されます。可変引数関数が呼び出されるときに昇格が行われるため、これらの型の値を渡しても安全です。

固定幅文字型(int8_t など)の正しい変換指定はヘッダ <inttypes.h> で定義されています(ただし PRIdMAX、PRIuMAX などは %jd、%ju などと同義です)。

メモリ書き込み変換指定子 %n は、書式文字列がユーザー入力に依存する場合のセキュリティエクスプロイトの一般的な標的であり、境界チェック付きの printf_s 関数ファミリではサポートされていません(C11 以降)。

各変換指定子の動作の後にシーケンスポイント があります。これにより、複数の %n 結果を同じ変数に格納したり、エッジケースとして、同じ呼び出し内で以前の %n によって変更された文字列を出力したりできます。

変換指定が無効な場合、動作は未定義です。

戻り値

1,2) 出力ストリームに転送された文字数。出力エラーまたは(文字および文字列変換指定子の場合)エンコードエラーが発生した場合は負の値。
3) buffer に書き込まれた文字数(終端のヌル文字は数えない)。または(文字および文字列変換指定子の場合)エンコードエラーが発生した場合は負の値。
4) buffer が無視された場合に bufsz に書き込まれたはずの文字数(終端のヌル文字を含まない)。または(文字および文字列変換指定子の場合)エンコードエラーが発生した場合は負の値。
5,6) 出力ストリームに転送された文字数。出力エラー、実行時制約違反エラー、またはエンコードエラーが発生した場合は負の値。
7) buffer に書き込まれた文字数。ヌル文字(buffer がヌルポインタでなく、bufsz がゼロでなく RSIZE_MAX 以下である限り常に書き込まれる)は数えない。実行時制約違反の場合はゼロ、エンコードエラーの場合は負の値。
8) 終端のヌル文字(buffer がヌルポインタでなく、bufsz がゼロでなく RSIZE_MAX 以下である限り常に書き込まれる)を含まない文字数。buffer が無視された場合に bufsz に書き込まれたはずの数。または実行時制約違反またはエンコードエラーが発生した場合は負の値。

ノート

C 標準と POSIX は、引数が宛先バッファと重なる場合の sprintf およびその変種の動作は未定義であると規定しています。例:

sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behavior

POSIX は、エラー時に errno が設定されることを規定しています。また、追加の変換指定、特に引数の並べ替えのサポート(n$ の直後の % は n番目 の引数を示します)も規定しています。

ゼロの snprintf と bufsz へのヌルポインタを指定して buffer を呼び出すと、出力を格納するために必要なバッファサイズを決定するのに便利です。

const char fmt[] = "sqrt(2) = %f";
int sz = snprintf(NULL, 0, fmt, sqrt(2));
char buf[sz + 1]; // note +1 for terminating null byte
snprintf(buf, sizeof buf, fmt, sqrt(2));

snprintf_ssnprintf と同様ですが、sprintf_s とは異なり、出力を bufsz - 1 に収まるように切り詰めます。

例

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main(void)
{
    const char* s = "Hello";
    printf("Strings:\n"); // same as puts("Strings");
    printf(" padding:\n");
    printf("\t[%10s]\n", s);
    printf("\t[%-10s]\n", s);
    printf("\t[%*s]\n", 10, s);
    printf(" truncating:\n");
    printf("\t%.4s\n", s);
    printf("\t%.*s\n", 3, s);

    printf("Characters:\t%c %%\n", 'A');

    printf("Integers:\n");
    printf("\tDecimal:\t%i %d %.6i %i %.0i %+i %i\n",
                         1, 2,   3, 0,   0,  4,-4);
    printf("\tHexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6);
    printf("\tOctal:\t\t%o %#o %#o\n", 10, 10, 4);

    printf("Floating-point:\n");
    printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
    printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
    printf("\tScientific:\t%E %e\n", 1.5, 1.5);
    printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5);
    printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0 / 0.0, 1.0 / 0.0);

    printf("Fixed-width types:\n");
    printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n",
                                     UINT32_MAX,     UINT32_MAX );
}

出力例:

Strings:
 padding:
        [     Hello]
        [Hello     ]
        [     Hello]
 truncating:
        Hell
        Hel
Characters:     A %
Integers:
        Decimal:        1 2 000003 0  +4 -4
        Hexadecimal:    5 a A 0x6
        Octal:          12 012 04
Floating-point:
        Rounding:       1.500000 2 1.30000000000000004440892098500626
        Padding:        01.50 1.50  1.50
        Scientific:     1.500000E+00 1.500000e+00
        Hexadecimal:    0x1.8p+0 0X1.8P+0
        Special values: 0/0=-nan 1/0=inf
Fixed-width types:
        Largest 32-bit value is 4294967295 or 0xffffffff

参考文献

  • C23 規格 (ISO/IEC 9899:2024):
  • 7.21.6.1 fprintf 関数 (p: TBD)
  • 7.21.6.3 printf 関数 (p: TBD)
  • 7.21.6.5 snprintf 関数 (p: TBD)
  • 7.21.6.6 sprintf 関数 (p: TBD)
  • K.3.5.3.1 fprintf_s 関数 (p: TBD)
  • K.3.5.3.3 printf_s 関数 (p: TBD)
  • K.3.5.3.5 snprintf_s 関数 (p: TBD)
  • K.3.5.3.6 sprintf_s 関数 (p: TBD)
  • C17 規格 (ISO/IEC 9899:2018):
  • 7.21.6.1 fprintf 関数 (p: 225-230)
  • 7.21.6.3 printf 関数 (p: 236)
  • 7.21.6.5 snprintf 関数 (p: 237)
  • 7.21.6.6 sprintf 関数 (p: 237)
  • K.3.5.3.1 fprintf_s 関数 (p: 430)
  • K.3.5.3.3 printf_s 関数 (p: 432)
  • K.3.5.3.5 snprintf_s 関数 (p: 432-433)
  • K.3.5.3.6 sprintf_s 関数 (p: 433)
  • C11 規格 (ISO/IEC 9899:2011):
  • 7.21.6.1 fprintf 関数 (p: 309-316)
  • 7.21.6.3 printf 関数 (p: 324)
  • 7.21.6.5 snprintf 関数 (p: 325)
  • 7.21.6.6 sprintf 関数 (p: 325-326)
  • K.3.5.3.1 fprintf_s 関数 (p: 591)
  • K.3.5.3.3 printf_s 関数 (p: 593-594)
  • K.3.5.3.5 snprintf_s 関数 (p: 594-595)
  • K.3.5.3.6 sprintf_s 関数 (p: 595-596)
  • C99 規格 (ISO/IEC 9899:1999):
  • 7.19.6.1 fprintf 関数 (p: 274-282)
  • 7.19.6.3 printf 関数 (p: 290)
  • 7.19.6.5 snprintf 関数 (p: 290-291)
  • 7.19.6.6 sprintf 関数 (p: 291)
  • C89/C90 規格 (ISO/IEC 9899:1990):
  • 4.9.6.1 fprintf 関数
  • 4.9.6.3 printf 関数
  • 4.9.6.5 sprintf 関数

関連項目

書式付きワイド文字出力を stdout、ファイルストリーム、またはバッファに出力します
(関数)
可変引数リストを使用して書式付き出力を stdout、ファイルストリーム、またはバッファに出力します
(関数)
文字列をファイルストリームに書き込みます
(関数)
stdin、ファイルストリーム、またはバッファから書式付き入力を読み取ります
(関数)
C++ ドキュメント printf fprintf sprintf snprintf