printf, fprintf, sprintf, snprintf, printf_s, fprintf_s, sprintf_s, snprintf_s
ヘッダ <stdio.h> で定義 | ||
(1) | ||
int printf(constchar*format, ... ); | (C99未満) | |
int printf(constchar*restrict format, ... ); | (C99以上) | |
(2) | ||
int fprintf(FILE*stream, constchar*format, ... ); | (C99未満) | |
int fprintf(FILE*restrict stream, constchar*restrict format, ... ); | (C99以上) | |
(3) | ||
int sprintf(char*buffer, constchar*format, ... ); | (C99未満) | |
int sprintf(char*restrict buffer, constchar*restrict format, ... ); | (C99以上) | |
int snprintf(char*restrict buffer, size_t bufsz, constchar*restrict format, ... ); | (4) | (C99以上) |
int printf_s(constchar*restrict format, ...); | (5) | (C11以上) |
int fprintf_s(FILE*restrict stream, constchar*restrict format, ...); | (6) | (C11以上) |
int sprintf_s(char*restrict buffer, rsize_t bufsz, constchar*restrict format, ...); | (7) | (C11以上) |
int snprintf_s(char*restrict buffer, rsize_t bufsz, constchar*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 などは メモリに書き込む変換指定子 %n は、書式文字列がユーザ入力に依存する場合、セキュリティエクスプロイトのよくあるターゲットであり、境界チェック付きの 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の %n の結果を格納することができ、またエッジケースとして、同じ呼び出しの中で先行する %n によって変更された値を表示することができます。 変換指定が無効な場合、動作は未定義です。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
... | - | 表示するデータを指定する引数。 デフォルト変換後のいずれかの引数が対応する変換指定子の期待する型でない場合、または 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
を呼ぶのは、出力を保持するために必要なバッファサイズを決定するのに便利です。
snprintf_s
は、 snprintf
と同様に、しかし sprintf_s
とは異なり、出力を bufsz-1
に収まるように切り捨てます。
[編集]例
#include <stdio.h> int main(void){ printf("Strings:\n");constchar* 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++リファレンス |