printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
| ヘッダ <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 以降) |
指定された位置からデータを読み込み、それらを文字列相当に変換し、結果をさまざまな出力先・ストリームに書き込みます。
stream に書き込みます。buffer に書き込みます。書き込まれる文字列(終端のヌル文字を含む)が buffer の指す配列のサイズを超える場合、動作は未定義です。buffer に書き込みます。最大 bufsz - 1 文字が書き込まれます。結果の文字列は、bufsz がゼロでない限り、ヌル文字で終端されます。bufsz がゼロの場合、何も書き込まれず、buffer はヌルポインタでも構いませんが、戻り値(ヌル終端を含まない、書き込まれるはずだったバイト数)は依然として計算され返されます。- 変換指定子
%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文字 を書き込みます。
|
N/A | N/A | int |
wint_t |
N/A | N/A | N/A | N/A | N/A |
s
|
文字列 を書き込みます。
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
di
|
符号付き整数 を10進表現 [-]dddd に変換します。
|
signed char |
short |
int |
long |
long long |
intmax_t |
※ |
ptrdiff_t |
N/A |
bB (オプション)
(C23) |
符号なし整数 を2進表現 bbbb に変換します。
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
uintmax_t |
size_t |
ptrdiff_t |
の符号なしバージョンN/A |
o
|
符号なし整数 を8進表現 oooo に変換します。
|
N/A | ||||||||
xX
|
符号なし整数 を16進表現 hhhh に変換します。
|
N/A | ||||||||
u
|
符号なし整数 を10進表現 dddd に変換します。
|
N/A | ||||||||
fF (C99)
|
浮動小数点数 を [-]ddd.ddd 形式の10進表記に変換します。
|
N/A | N/A | double |
double (C99) |
N/A | N/A | N/A | N/A | long double |
eE
|
浮動小数点数 を10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
aA
(C99) |
浮動小数点数 を16進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
gG
|
浮動小数点数 を、値と 精度 に応じて、10進表記または10進指数表記に変換します。
|
N/A | N/A | N/A | N/A | N/A | N/A | |||
n
|
この関数呼び出しでこれまでに書き込まれた文字数 を返します。
|
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 |
| ノート | ||||||||||
|
浮動小数点変換関数は無限大を 非数は 変換
固定幅文字型(int8_t など)の正しい変換指定はヘッダ <inttypes.h> で定義されています(ただし PRIdMAX、PRIuMAX などは メモリ書き込み変換指定子 各変換指定子の動作の後にシーケンスポイント があります。これにより、複数の 変換指定が無効な場合、動作は未定義です。 | ||||||||||
戻り値
buffer に書き込まれた文字数(終端のヌル文字は数えない)。または(文字および文字列変換指定子の場合)エンコードエラーが発生した場合は負の値。buffer が無視された場合に bufsz に書き込まれたはずの文字数(終端のヌル文字を含まない)。または(文字および文字列変換指定子の場合)エンコードエラーが発生した場合は負の値。buffer に書き込まれた文字数。ヌル文字(buffer がヌルポインタでなく、bufsz がゼロでなく RSIZE_MAX 以下である限り常に書き込まれる)は数えない。実行時制約違反の場合はゼロ、エンコードエラーの場合は負の値。buffer がヌルポインタでなく、bufsz がゼロでなく RSIZE_MAX 以下である限り常に書き込まれる)を含まない文字数。buffer が無視された場合に bufsz に書き込まれたはずの数。または実行時制約違反またはエンコードエラーが発生した場合は負の値。ノート
C 標準と POSIX は、引数が宛先バッファと重なる場合の sprintf およびその変種の動作は未定義であると規定しています。例:
sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behaviorPOSIX は、エラー時に 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 関数
関連項目
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
書式付きワイド文字出力を stdout、ファイルストリーム、またはバッファに出力します (関数) |
(C99)(C11)(C11)(C11)(C11) |
可変引数リストを使用して書式付き出力を stdout、ファイルストリーム、またはバッファに出力します (関数) |
| 文字列をファイルストリームに書き込みます (関数) | |
(C11)(C11)(C11) |
stdin、ファイルストリーム、またはバッファから書式付き入力を読み取ります (関数) |
C++ ドキュメント printf fprintf sprintf snprintf
| |