Namespaces
Variants

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

From cppreference.net
< c ‎ | io
ヘッダーで定義 <stdio.h>
(1)
int printf ( const char * format, ... ) ;
(C99まで)
int printf ( const char * restrict format, ... ) ;
(C99以降)
(2)
int fprintf ( FILE * stream, const char * format, ... ) ;
(C99まで)
int fprintf ( FILE * restrict stream, const char * restrict format, ... ) ;
(C99以降)
(3)
int sprintf ( char * buffer, const char * format, ... ) ;
(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 に対応する引数のいずれかがnullポインタの場合
  • stream または format または buffer がnullポインタの場合
  • bufsz がゼロまたは RSIZE_MAX より大きい場合
  • 文字列および文字変換指定子でエンコーディングエラーが発生した場合
  • sprintf_s のみ) buffer に格納される文字列(末尾のnullを含む)が bufsz を超える場合
すべての境界チェック付き関数と同様に、 printf_s fprintf_s sprintf_s snprintf_s は、実装によって __STDC_LIB_EXT1__ が定義され、かつユーザーが <stdio.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ利用可能であることが保証されます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の用語(Parameters、Return value、Notes、Example、References、See also)は翻訳せず、原文のまま保持しました - HTMLタグ、属性、クラス名、ID、リンク先はすべて変更せず保持しました - 数値や書式設定は完全に維持しました

パラメータ

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

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

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

以下のフォーマット指定子が利用可能です:

変換
指定子
説明 期待される
引数の型
長さ修飾子→ hh h none 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

単一文字 を書き込みます。

  • 引数はまず 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配列に変換されます。
該当なし 該当なし
char *
wchar_t *
該当なし 該当なし 該当なし 該当なし 該当なし
d
i

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

  • 精度 は表示する最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換結果は文字を生成しません。
  • z 修飾子の場合、期待される引数の型は size_t の符号付きバージョンです。
signed char
short
int
long
long long
N/A
o

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

  • 精度 は表示される最小桁数を指定します。デフォルトの精度は 1 です。
  • 変換された値と精度の両方が 0 の場合、変換結果は文字を出力しません。
  • 代替実装 では、必要に応じて精度が増加され、先頭に1つのゼロが書き込まれます。その場合、変換された値と精度の両方が 0 の場合、単一の 0 が書き込まれます。
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
ptrdiff_t の符号なしバージョン
該当なし
x
X

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

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

unsigned integer を10進数表現 dddd に変換します。

  • Precision は表示する最小桁数を指定します。
  • デフォルトの精度は 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 変換スタイルでは [-]  0x h.hhh  p ±d が使用されます。
  • A 変換スタイルでは [-]  0X h.hhh  P ±d が使用されます。
  • 引数が正規化浮動小数点値の場合、最初の16進数は 0 ではありません。
  • 値が 0 の場合、指数も 0 になります。
  • 精度 は16進小数点文字の後に表示される正確な桁数を指定します。
  • デフォルトの精度は値を正確に表現するのに十分です。
  • 代替実装 では、後続する桁がなくても10進小数点文字が書き込まれます。
  • 無限大および非数の変換スタイルについては 注記 を参照してください。
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 を、精度が0でない場合はその値、精度が指定されていない場合は 6 、精度が 0 の場合は 1 とします。このとき、 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 *
N/A
p

実装定義の文字シーケンスを書き込み、 pointer を定義します。

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 に書き込まれた文字数(終端のnull文字は含まない)。エンコーディングエラー(文字列および文字変換指定子の場合)が発生した場合は負の値。
4) 終端ナル文字を含まない、書き込まれたであろう文字数( buffer bufsz が無視された場合)、またはエンコーディングエラー(文字列および文字変換指定子の場合)が発生した場合は負の値。
5,6) 出力ストリームに送信された文字数、または出力エラー、実行時制約違反エラー、エンコーディングエラーが発生した場合は負の値。
7) buffer に書き込まれた文字数(null文字は含まない。ただし、 buffer がnullポインタでなく、 bufsz がゼロでなく RSIZE_MAX 以下である限り常に書き込まれる)、または実行時制約違反の場合はゼロ、エンコーディングエラーの場合は負の値。
8) 終端ナル文字を含まない文字数( buffer がナルポインタでなく、 bufsz がゼロでなく RSIZE_MAX を超えない限り、常に書き込まれる)、これは bufsz が無視された場合に buffer に書き込まれたであろう文字数、または実行時制約違反もしくはエンコーディングエラーが発生した場合は負の値。

注記

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

sprintf(dst, "%s and %s", dst, t); // <- 壊れている: 未定義動作

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]; // 終端ナルバイトのための +1 に注意
snprintf(buf, sizeof buf, fmt, sqrt(2));

snprintf_s snprintf と同様に、しかし 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++ documentation for printf , fprintf , sprintf , snprintf