printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
|
ヘッダーで定義
<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以降) |
指定された場所からデータを読み込み、それらを文字列相当に変換し、結果を様々なシンク/ストリームに書き込みます:
-
-
変換指定子
%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 に定義した場合にのみ利用可能であることが保証されます。
目次 |
パラメータ
| 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
|
単一文字 を書き込みます。
|
N/A | N/A |
int
|
wint_t
|
N/A | N/A | N/A | N/A | N/A |
s
|
文字列 を書き込みます。
|
該当なし | 該当なし |
char
*
|
wchar_t
*
|
該当なし | 該当なし | 該当なし | 該当なし | 該当なし |
d
i
|
符号付き整数 を10進数表現 [-]dddd に変換します。
|
signed
char
|
short
|
int
|
long
|
long
long
|
※
|
N/A | ||
o
|
符号なし整数 を8進数表現 oooo に変換します。
|
unsigned
char
|
unsigned
short
|
unsigned
int
|
unsigned
long
|
unsigned
long
long
|
ptrdiff_t
の符号なしバージョン
|
該当なし | ||
x
X
|
符号なし整数 を16進数表現 hhhh に変換します。
|
N/A | ||||||||
u
|
unsigned integer を10進数表現 dddd に変換します。
|
N/A | ||||||||
f
F
(C99)
|
浮動小数点数 を [-]ddd.ddd スタイルの10進表記に変換します。
|
N/A | N/A |
double
|
double
(C99)
|
N/A | N/A | N/A | N/A |
long
double
|
e
E
|
浮動小数点数 を10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
a
A
(C99) |
浮動小数点数を16進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
g
G
|
浮動小数点数 を値と 精度 に応じて10進数表記または10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
この関数呼び出しでこれまでに 書き込まれた文字数 を返します。
|
signed
char
*
|
short
*
|
int
*
|
long
*
|
long
long
*
|
intmax_t
*
|
※
|
N/A | |
p
|
実装定義の文字シーケンスを書き込み、 pointer を定義します。 |
N/A | N/A |
void
*
|
N/A | N/A | N/A | N/A | N/A | N/A |
| 注記 | ||||||||||
|
浮動小数点変換関数は、無限大を
非数は
変換指定子
char 、 unsigned char 、 signed char 、 short 、および unsigned short を出力するための変換指定子は、 デフォルト引数プロモーション によってプロモートされた型を期待しますが、出力前にその値は char 、 unsigned char 、 signed char 、 short 、 unsigned short に変換されます。可変引数関数が呼び出されるときに行われるプロモーションにより、これらの型の値を渡すことは安全です。
固定幅文字型(
int8_t
など)に対する正しい変換指定は、ヘッダ
<inttypes.h>
で定義されています(ただし
PRIdMAX
、
PRIuMAX
などは
メモリ書き込み変換指定子
各変換指定子の動作の後には
シーケンスポイント
があります。これにより、複数の
変換指定が無効な場合、動作は未定義です。 |
||||||||||
戻り値
注記
C標準および
POSIX
は、引数が宛先バッファと重複する場合の
sprintf
およびその亜種の動作は未定義であると規定しています。例:
sprintf(dst, "%s and %s", dst, t); // <- 壊れている: 未定義動作
POSIXは
エラー時に
errno
が設定されることを規定しています。また、追加の変換指定子も規定しており、最も注目すべきは引数の再順序付けのサポートです(
n$
が
%
の直後に続く場合、
n
番目
の引数を示します)。
snprintf
をゼロの
bufsz
と
buffer
に対するヌルポインタで呼び出すことは、出力を格納するために必要なバッファサイズを決定するのに有用です:
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関数
関連項目
|
(C95)
(C95)
(C95)
(C11)
(C11)
(C11)
(C11)
|
書式化されたワイド文字出力を
stdout
、ファイルストリーム、またはバッファに出力する
(関数) |
|
(C99)
(C11)
(C11)
(C11)
(C11)
|
可変引数リストを使用して書式化された出力を
stdout
、ファイルストリーム、またはバッファに出力する
(関数) |
|
文字列をファイルストリームに書き込む
(関数) |
|
|
(C11)
(C11)
(C11)
|
書式化された入力を
stdin
、ファイルストリーム、またはバッファから読み込む
(関数) |
|
C++ documentation
for
printf
,
fprintf
,
sprintf
,
snprintf
|
|