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以上) |
指定された位置からデータをロードし、それらを文字列に変換し、結果を様々なシンクに書き込みます。
stream に書き込みます。buffer に書き込みます。 書き込まれる文字列 (および終端のヌル文字) が buffer の指す配列のサイズを超える場合、動作は未定義です。buffer に書き込みます。 最大 bufsz - 1 文字が書き込まれます。 bufsz がゼロでなければ、結果の文字列はヌル文字で終端されます。 bufsz がゼロの場合は、何も書き込まれず、 buffer はヌルポインタであっても構いませんが、その場合でも戻り値 (本来書き込まれたはずのヌル終端を含まないバイト数) は計算され、返されます。formatに変換指定子%nが存在する。%sに対応するいずれかの引数がヌルポインタ。formatまたはbufferがヌルポインタ。bufszがゼロまたは RSIZE_MAX より大きい。- いずれかの文字列または文字変換指定子でエンコーディングエラーが発生する。
- (
sprintf_sの場合のみ)bufferに格納される文字列 (末尾のヌルを含む) が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 | - | データの解釈方法を指定するヌル終端マルチバイト文字列を指すポインタ。
書式文字列は、変更されずに出力ストリームにコピーされる (
以下の書式指定子が利用できます。
浮動小数点変換関数は無限大を 非数は 変換
固定幅の整数型 (int8_t など) に対する正しい変換指定はヘッダ <inttypes.h> で定義されています (PRIdMAX, PRIuMAX などは メモリに書き込む変換指定子 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の 変換指定が無効な場合、動作は未定義です。
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ... | - | 表示するデータを指定する引数。 デフォルト変換後のいずれかの引数が対応する変換指定子の期待する型でない場合、または format が要求するより少ない引数しかない場合、動作は未定義です。 format が要求するより多くの引数がある場合、余分な引数は評価され、無視されます
|
戻り値
buffer に書き込まれた文字数 (終端のヌル文字はカウントされません)。 (文字列または文字変換指定子に対して) エンコーディングエラーが発生した場合は負の値。bufsz を無視したならば buffer に書き込まれたであろう文字数 (終端のヌル文字は含みません)。 (文字列または文字変換指定子に対して) エンコーディングエラーが発生した場合は負の値。buffer に書き込まれた文字数 (ヌル文字はカウントされません。 buffer がヌルポインタでなく、 bufsz がゼロでなく RSIZE_MAX よりも大きくなければ、ヌル文字は常に書き込まれます)。 実行時制約違反の場合はゼロ。 エンコーディングエラーの場合は負の値。bufsz を無視したならば buffer に書き込まれたであろう文字数 (終端のヌル文字は含みません。 buffer がヌルポインタでなく、 bufsz がゼロでなく RSIZE_MAX よりも大きくなければ、ヌル文字は常に書き込まれます)。 実行時制約違反またはエンコーディングエラーの場合は負の値。ノート
sprintf およびその変種は、引数が書き込み先のバッファとオーバーラップするとき、未定義動作になります。 例えば、
sprintf(dst, "%s and %s", dst, t); // <- broken: undefined behavior
POSIX はエラーの場合に errno が設定されると規定しています。 また、追加の変換指定、特に顕著なものとして引数の順序変更のためのサポート (% 直後の n$ が n 番目の引数を表す) を規定しています。
bufsz にゼロを、 buffer にヌルポインタを指定して snprintf を呼ぶのは、出力を保持するために必要なバッファサイズを決定するのに便利です。
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_s は、 snprintf と同様に、しかし sprintf_s とは異なり、出力を bufsz-1 に収まるように切り捨てます。
例
#include <stdio.h>
int main(void)
{
printf("Strings:\n");
const char* s = "Hello";
printf("\t.%10s.\n\t.%-10s.\n\t.%*s.\n", s, s, 10, s);
printf("Characters:\t%c %%\n", 65);
printf("Integers\n");
printf("Decimal:\t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4, -4);
printf("Hexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6);
printf("Octal:\t%o %#o %#o\n", 10, 10, 4);
printf("Floating point\n");
printf("Rounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
printf("Padding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
printf("Scientific:\t%E %e\n", 1.5, 1.5);
printf("Hexadecimal:\t%a %A\n", 1.5, 1.5);
}
出力:
Strings:
. Hello.
.Hello .
. Hello.
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
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.21.6.1 The fprintf function (p: 309-316)
- 7.21.6.3 The printf function (p: 324)
- 7.21.6.5 The snprintf function (p: 325)
- 7.21.6.6 The sprintf function (p: 325-326)
- K.3.5.3.1 The fprintf_s function (p: 591)
- K.3.5.3.3 The printf_s function (p: 593-594)
- K.3.5.3.5 The snprintf_s function (p: 594-595)
- K.3.5.3.6 The sprintf_s function (p: 595-596)
- C99 standard (ISO/IEC 9899:1999):
- 7.19.6.1 The fprintf function (p: 274-282)
- 7.19.6.3 The printf function (p: 290)
- 7.19.6.5 The snprintf function (p: 290-291)
- 7.19.6.6 The sprintf function (p: 291)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.9.6.1 The fprintf function
- 4.9.6.3 The printf function
- 4.9.6.5 The sprintf function
関連項目
(C95)(C95)(C95)(C11)(C11)(C11)(C11) |
stdout、ファイルストリームまたはバッファに書式付きワイド文字出力を書き出します (関数) |
(C99)(C11)(C11)(C11)(C11) |
stdout、ファイルストリームまたはバッファに可変個引数リストを使用して書式付き出力を書き出します (関数) |
| ファイルストリームに文字列を書き込みます (関数) | |
(C11)(C11)(C11) |
stdin、ファイルストリームまたはバッファから書式付き入力を読み取ります (関数) |
printf, fprintf, sprintf, snprintf の C++リファレンス
|