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以降) |
与えられた場所からデータをロードし、それらを文字列表現に変換し、結果を様々な出力先に書き込みます。
sprintf または snprintf の呼び出しが、オーバーラップするオブジェクト間でコピーを引き起こす場合、動作は未定義です (例: sprintf(buf, "%s text", buf);)。
目次 |
[編集] パラメータ
| stream | - | 書き込む出力ファイルストリーム |
| buffer | - | 書き込み先の文字列へのポインタ |
| buf_size | - | buf_size - 1 文字までとヌル終端文字が書き込まれます |
| format | - | データをどのように解釈するかを指定する、ヌル終端されたマルチバイト文字列へのポインタ |
| ... | - | 出力するデータを指定する引数。デフォルト引数昇格の後、対応する変換指定子が期待する型と引数の型が異なる場合 (期待される型は昇格された型または昇格された型と互換性のある型)、または format が要求する引数よりも少ない場合、動作は未定義です。format が要求する引数よりも多い場合、余分な引数は評価され無視されます。 |
format 文字列は、出力ストリームにそのままコピーされる通常のバイト文字 (% を除く) と、変換指定子で構成されます。各変換指定子は以下の形式を持ちます。
- 先頭の
%文字。
- 先頭の
- (オプション) 変換の動作を変更する1つ以上のフラグ
-
-: 変換の結果はフィールド内で左寄せされます (デフォルトは右寄せ)。 -
+: 符号付き変換の結果には常に符号が前置されます (デフォルトでは負の場合にのみマイナスが前置されます)。 - space: 符号付き変換の結果が符号文字で始まらない場合、または空の場合、スペースが結果の前に付加されます。
+フラグが存在する場合は無視されます。 -
#: 変換の代替形式が実行されます。正確な効果については以下の表を参照してください。それ以外の場合、動作は未定義です。 -
0: 整数および浮動小数点数の変換の場合、フィールドのパディングにはスペース文字ではなく先行ゼロが使用されます。整数数の場合、精度が明示的に指定されている場合は無視されます。このフラグを使用する他の変換では、未定義の動作が発生します。-フラグが存在する場合は無視されます。
-
- (オプション) 最小フィールド幅を指定する整数値または
*。必要に応じて、結果はスペース文字でパディングされます (デフォルト)。右寄せの場合は左側に、左寄せの場合は右側にパディングされます。*が使用される場合、幅は int 型の追加の引数によって指定されます。この引数は変換される引数の前に現れ、精度が指定されている場合は精度の引数の前に現れます。引数の値が負の場合、-フラグが指定され、正のフィールド幅になります (注: これは最小幅であり、値が切り捨てられることはありません)。
- (オプション) 最小フィールド幅を指定する整数値または
- (オプション)
.の後に整数値または*が続くか、どちらも続かない精度を指定します。*が使用される場合、精度は int 型の追加の引数によって指定されます。この引数は変換される引数の前に現れますが、最小フィールド幅が指定されている場合はその引数の後に現れます。この引数の値が負の場合、無視されます。数値も*も使用されない場合、精度はゼロとみなされます。精度の正確な効果については以下の表を参照してください。
- (オプション)
- (オプション) 引数のサイズを指定する長さ修飾子 (変換フォーマット指定子と組み合わせて、対応する引数の型を指定します)。
- 変換フォーマット指定子。
以下のフォーマット指定子が利用可能です
| 変換 指定子 |
説明 | 期待される 引数型 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 長さ修飾子→ | hh | h | なし | l | ll | j | z | t | L | |
| C++11からのみ利用可能→ | はい | はい | はい | はい | はい | |||||
%
|
リテラル % を書き込みます。完全な変換指定子は %% でなければなりません。 |
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
単一の文字を書き込みます。
|
N/A | N/A | int |
std::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 |
※ |
N/A | ||
o
|
符号なし整数を8進数表現 oooo に変換します。
|
unsigned char |
unsigned short |
unsigned int |
unsigned long |
unsigned long long |
std::ptrdiff_t の符号なしバージョン |
N/A | ||
xX
|
符号なし整数を16進数表現 hhhh に変換します。
|
N/A | ||||||||
u
|
符号なし整数を10進数表現 dddd に変換します。
|
N/A | ||||||||
fF (C++11)
|
浮動小数点数を [-]ddd.ddd の形式で10進数表記に変換します。
|
N/A | N/A | double |
double (C++11) |
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
(C++11) |
浮動小数点数を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* |
※ |
N/A | ||
p
|
ポインタを定義する実装定義の文字シーケンスを書き込みます。 |
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 に変換されます。可変引数関数が呼び出される際に昇格が行われるため、これらの型の値を渡しても安全です。 固定幅文字型 (std::int8_t など) の正しい変換指定子は、ヘッダ <cinttypes> で定義されています (ただし、PRIdMAX, PRIuMAX などは メモリ書き込み変換指定子 各変換指定子の動作の後にはシーケンスポイントがあります。これにより、同じ変数に複数の 変換指定子が不正な場合、動作は未定義です。 | ||||||||||
[編集] 戻り値
[編集] 注釈
POSIXは、エラー時に errno が設定されると規定しています。また、追加の変換指定子も規定しており、特に引数の順序変更 (% の直後に n$ が続く場合、n番目の引数を示します) をサポートしています。
std::snprintf を buf_size をゼロに、buffer をヌルポインタにして呼び出すと、出力に必要なバッファサイズを決定するのに役立ちます (二重呼び出しのオーバーヘッドが許容される場合)。
auto 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::sprintf(buf.data(), fmt, std::sqrt(2)); // certain to fit
[編集] 例
#include <cinttypes> #include <cstdint> #include <cstdio> #include <limits> int main() { const char* s = "Hello"; std::printf("Strings:\n"); // same as std::puts("Strings:"); std::printf("\t[%10s]\n", s); std::printf("\t[%-10s]\n", s); std::printf("\t[%*s]\n", 10, s); std::printf("\t[%-10.*s]\n", 4, s); std::printf("\t[%-*.*s]\n", 10, 4, s); std::printf("Characters:\t%c %%\n", 'A'); std::printf("Integers:\n"); std::printf("\tDecimal: \t%i %d %.6i %i %.0i %+i %i\n", 1, 2, 3, 0, 0, 4,-4); std::printf("\tHexadecimal:\t%x %x %X %#x\n", 5,10,10, 6); std::printf("\tOctal: \t%o %#o %#o\n", 10, 10, 4); std::printf("Floating point:\n"); std::printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3); std::printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5); std::printf("\tScientific:\t%E %e\n", 1.5, 1.5); std::printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5); std::printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0/0.0, 1.0/0.0); std::printf("Variable width control:\n"); std::printf("\tright-justified variable width: '%*c'\n", 5, 'x'); int r = std::printf("\tleft-justified variable width : '%*c'\n", -5, 'x'); std::printf("(the last printf printed %d characters)\n", r); std::printf("Fixed-width types:\n"); std::uint32_t val = std::numeric_limits<std::uint32_t>::max(); std::printf("\tLargest 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 41 characters) Fixed-width types: Largest 32-bit value is 4294967295 or 0xffffffff
[編集] 関連項目
| stdout、ファイルストリーム、またはバッファに書式付きワイド文字出力を書き込む (関数) | |
| stdout、ファイルストリーム、またはバッファにフォーマットされた出力を書き込む 可変長引数リストを使用する (関数) | |
| ファイルストリームに文字列を書き込む (関数) | |
| stdin、ファイルストリーム、またはバッファから書式付き入力を読み取ります。 (関数) | |
| (C++17) |
整数値または浮動小数点数値を文字シーケンスに変換する (関数) |
| (C++23) |
引数の書式化された表現を用いて、stdoutまたはファイルストリームに出力する (関数テンプレート) |
| (C++23) |
std::printと同じだが、各出力の末尾に改行が追加される点が異なる (関数テンプレート) |
| printf, fprintf, sprintf, snprintf のC言語ドキュメント
| |