std::printf, std::fprintf, std::sprintf, std::snprintf
ヘッダ <cstdio> で定義
|
||
int printf( const char* format, ... ); |
(1) | |
int fprintf( std::FILE* stream, const char* format, ... ); |
(2) | |
int sprintf( char* buffer, const char* format, ... ); |
(3) | |
int snprintf( char* buffer, std::size_t buf_size, const char* format, ... ); |
(4) | (C++11以上) |
指定された位置からデータをロードし、それらを文字列に変換し、結果を様々なシンクに書き込みます。
stream
に書き込みます。buffer
に書き込みます。buffer
に書き込みます。 最大 buf_size - 1
文字が書き込まれます。 buf_size
がゼロでなければ、結果の文字列はヌル文字で終端されます。 buf_size
がゼロの場合は、何も書き込まれず、 buffer
はヌルポインタであっても���いませんが、その場合でも戻り値 (本来書き込まれたはずのヌル終端を含まないバイト数) は計算され、返されます。sprintf
または snprintf
の呼び出しによってオーバーラップするオブジェクト間のコピーが発生する場合、動作は未定義です (例えば sprintf(buf, "%s text", buf);)。
目次 |
[編集] 引数
stream | - | 書き込む出力ファイルストリーム | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buffer | - | 書き込む文字列を指すポインタ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
buf_size | - | 最大 buf_size - 1 文字およびヌル終端が書き込まれる可能性があります | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
format | - | データの解釈方法を指定するヌル終端マルチバイト文字列を指すポインタ。
書式文字列は、変更されずに出力ストリームにコピーされる (
以下の書式指定子が利用できます。
浮動小数点変換関数は無限大を 非数は 変換
固定幅の整数型 (int8_t など) に対する正しい変換指定はヘッダ <cinttypes> で定義されています (PRIdMAX, PRIuMAX などは メモリに書き込む変換指定子 %n は、書式文字列がユーザ入力に依存する場合、セキュリティエクスプロイトのよくあるターゲットであり、境界チェック付きの 変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の %n の結果を格納することができ、またエッジケースとして、同じ呼び出しの中で先行する %n によって変更された値を表示することができます。 変換指定が無効な場合、動作は未定義です。
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
... | - | 表示するデータを指定する引数。 デフォルト変換後のいずれかの引数が対応する変換指定子の期待する型でない場合、または format が要求するより少ない引数しかない場合、動作は未定義です。 format が要求するより多くの引数がある場合、余分な引数は評価され、無視されます
|
[編集] 戻り値
buf_size
より小さい非負の値である場合に限り、 (ヌル終端された) 出力は完全に書き込まれています。[編集] ノート
POSIX はエラーの場合に errno が設定されると規定しています。 また、追加の変換指定、特に顕著なものとして引数の順序変更のためのサポート (% 直後の n$ が n
番目の引数を表す) を規定しています。
buf_size
にゼロを、 buffer
にヌルポインタを指定して std::snprintf
を呼ぶのは、出力を保持するために必要なバッファサイズを決定するのに便利です。
const char *fmt = "sqrt(2) = %f"; int sz = std::snprintf(nullptr, 0, fmt, std::sqrt(2)); std::vector<char> buf(sz + 1); // note +1 for null terminator std::snprintf(&buf[0], buf.size(), fmt, std::sqrt(2));
[編集] 例
#include <cstdio> #include <limits> #include <cstdint> #include <cinttypes> int main() { std::printf("Strings:\n"); const char* s = "Hello"; std::printf("\t[%10s]\n\t[%-10s]\n\t[%*s]\n\t[%-10.*s]\n\t[%-*.*s]\n", s, s, 10, s, 4, s, 10, 4, s); std::printf("Characters:\t%c %%\n", 65); std::printf("Integers\n"); std::printf("Decimal:\t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4, -4); std::printf("Hexadecimal:\t%x %x %X %#x\n", 5, 10, 10, 6); std::printf("Octal:\t%o %#o %#o\n", 10, 10, 4); std::printf("Floating point\n"); std::printf("Rounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); std::printf("Padding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); std::printf("Scientific:\t%E %e\n", 1.5, 1.5); std::printf("Hexadecimal:\t%a %A\n", 1.5, 1.5); std::printf("Special values:\t0/0=%g 1/0=%g\n", 0.0/0.0, 1.0/0.0); std::printf("Variable width control:\n"); std::printf("right-justified variable width: '%*c'\n", 5, 'x'); int r = std::printf("left-justified variable width : '%*c'\n", -5, 'x'); std::printf("(the last printf printed %d characters)\n", r); // fixed-width types std::uint32_t val = std::numeric_limits<std::uint32_t>::max(); std::printf("Largest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n", val, val); }
出力:
Strings: [ Hello] [Hello ] [ Hello] [Hell ] [Hell ] 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 Variable width control: right-justified variable width: ' x' left-justified variable width : 'x ' (the last printf printed 40 characters) Largest 32-bit value is 4294967295 or 0xffffffff
[編集] 関連項目
stdout、ファイルストリームまたはバッファに書式付きワイド文字出力を行います (関数) | |
可変個引数リストを使用して stdout、ファイルストリームまたはバッファに書式付き出力を行います (関数) | |
ファイルストリームに文字列を書き込みます (関数) | |
stdin、ファイルストリームまたはバッファから書式付き入力を行います (関数) | |
(C++17) |
整数値または浮動小数点値を文字シーケンスに変換します (関数) |
printf, fprintf, sprintf, snprintf の C言語リファレンス
|