名前空間
変種
操作

std::printf, std::fprintf, std::sprintf, std::snprintf

提供: cppreference.com
< cpp‎ | io‎ | c
 
 
 
C スタイルの入出力
関数
ファイルアクセス
直接入出力
書式なし入出力
書式付き入出力
(C++11)(C++11)(C++11)
printffprintfsprintfsnprintf
(C++11)
ファイル位置操作
エラー処理
ファイルに対する操作
 
ヘッダ <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およびそれ以降)

指定された位置からデータをロードし、それらを文字列に変換し、結果を様々なシンクに書き込みます。

1) 結果を stdout に書き込みます。
2) 結果をファイルストリーム stream に書き込みます。
3) 結果を文字列 buffer に書き込みます。
4) 結果を文字列 buffer に書き込みます。 最大 buf_size - 1 文字が書き込まれます。 buf_size がゼロでなければ、結果の文字列はヌル文字で終端されます。 buf_size がゼロの場合は、何も書き込まれず、 buffer はヌルポインタであっても構いませんが、その場合でも戻り値 (本来書き込まれたはずのヌル終端を含まないバイト数) は計算され、返されます。

sprintf または snprintf の呼び出しによってオーバーラップするオブジェクト間のコピーが発生する場合、動作は未定義です (例えば sprintf(buf, "%s text", buf);)。

目次

[編集] 引数

stream - 書き込む出力ファイルストリーム
buffer - 書き込む文字列を指すポインタ
buf_size - 最大 buf_size - 1 文字およびヌル終端が書き込まれる可能性があります
format - データの解釈方法を指定するヌル終端マルチバイト文字列を指すポインタ。

書式文字列は、変更されずに出力ストリームにコピーされる (% を除く) 通常のマルチバイト文字と、変換指定から構成されます。 各変換指定は以下の書式を持ちます。

  • 最初の % 文字。
  • (オプション) 変換の動作を変更する1つ以上のフラグ。
  • - : 変換の結果をフィールド内で左詰めします。 (デフォルトでは右詰めされます)。
  • + : 符号付き変換の符号が必ず変換の結果の前に付加されます (デフォルトでは負の場合にのみマイナスが結果の前に付加されます)。
  • 空白 : 符号付き変換の結果が符号文字で始まらない、または空の場合、空白が結果の前に付加されます。 + フラグが存在する場合、このフラグは無視されます。
  • # : 変換の代替形式が行われます。 正確な効果は下の表を参照してください。 記載がなければ動作は未定義です。
  • 0 : 整数または浮動小数点数の変換に対して、フィールドをパディングするために空白文字の代わりに先行するゼロが使用されます。 整数の場合、精度が明示的に指定されていれば、このフラグは無視されます。 それ以外の変換に対してこのフラグを使用した結果は未定義動作です。 - フラグが存在する場合、このフラグは無視されます。
  • (オプション) 最小フィールド幅を指定する整数値または *。 結果は、必要の場合は、左詰めの場合は右側に、右詰めの場合は左側に、 (デフォルトでは) 空白文字で、パディングされます。 * が使用された場合、幅は int 型の追加の引数によって指定されます。 引数の値が負の場合は、 - フラグと正のフィールド幅として解釈されます。 (ノート: これは最小の幅です。 値が切り捨てられることはありません。)
  • (オプション) 変換の精度を指定する . に続く整数または *、またはそのいずれも続かない単体の .* が使用された場合、 精度int 型の追加の引数によって指定されます。 この引数の値が負の場合、それは無視されます。 数値も * も続かない単体の . が使用された場合、精度はゼロとして扱われます。 精度 の正確な効果は下の表を参照してください。
  • (オプション) 引数のサイズを指定する長さ修飾子
  • 変換書式指定子。

以下の書式指定子が利用できます。

変換指定子 説明 引数の型
長さ修飾子 hh

(C++11)

h なし l ll

(C++11)

j

(C++11)

z

(C++11)

t

(C++11)

L
% % を書き込みます。 変換指定全体が %% でなければなりません。 N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

単一の文字を書き込みます。

引数はまず unsigned char に変換されます。 l 修飾子が指定された場合は、引数はまず、 wchar_t[2] 引数で %ls によって行われたかのように、文字列に変換されます。

N/A N/A
int
wint_t
N/A N/A N/A N/A N/A
s

文字列を書き込みます。

引数は文字配列の最初の要素を指すポインタでなければなりません。 精度は書き込まれる最大バイト数を指定します。 精度が指定されていない場合は、最初のヌル終端に達するまで、すべてのバイトが書き込まれます (ヌル終端は書き込まれません)。 l 指定子が使用された場合は、引数は wchar_t 配列の最初の要素を指すポインタでなければなりません。 それは、ゼロ初期化された変換状態を使用して wcrtomb を呼んだかのように、文字配列に変換されます。

N/A N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
d
i

符号付き整数を10進表現 [-]dddd に変換します。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。

signed char
short
int
long
long long
intmax_t
signed size_t
ptrdiff_t
N/A
o

符号なし整数を8進数表現 oooo に変換します。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。 代替表現では前にゼロを1個付加するために必要に応じて精度が増えます。 その場合、変換後の値と精度がどちらも 0 であれば単一の 0 が書き込まれます。

unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
uintmax_t
size_t
unsigned version of ptrdiff_t
N/A
x
X

符号なし整数を16進数表現 hhhh に変換します。

x 変換の場合は文字 abcdef が使用されます。 X 変換の場合は文字 ABCDEF が使用されます。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。 代替表現では変換結果がゼロでなければ結果の前に 0x または 0X が付加されます。

N/A
u

符号なし整数を10進数表現 dddd に変換します。

精度は出力される最小桁数を指定します。 デフォルトの精度は 1 です。 変換後の値と精度がどちらも 0 であれば変換結果は空文字列になります。

N/A
f
F

浮動小数点数[-]ddd.ddd 形式の10進数表記に変換します。

精度は小数点以下の最小桁数を指定します。 デフォルトの精度は 6 です。 代替表現では小数点の後に何もなくても小数点文字が書き込まれます。 無限大および非数の変換形式についてはノートを参照してください。

N/A N/A
double
double (C++11)
N/A N/A N/A N/A
long double
e
E

浮動小数点数を10進数の指数表記に変換します。

e 変換の場合は [-]d.ddde±dd 形式が使用されます。 E 変換の場合は [-]d.dddE±dd 形式が使用されます。

指数は少なくとも2桁あり、必要に応じて桁数が増えます。 値が 0 であれば、指数も 0 になります。 精度は小数点以下の最小桁数を指定します。 デフォルトの精度は 6 です。 代替表現では小数点の後に何もなくても小数点文字が書き込まれます。 無限大および非数の変換形式についてはノートを参照してください。

N/A N/A N/A N/A N/A N/A
a
A

(C++11)

浮動小数点数を16進数の指数表記に変換します。

a 変換の場合は [-]0xh.hhhp±d 形式が使用されます。 A 変換の場合は [-]0Xh.hhhP±d 形式が使用されます。

引数が正規化浮動小数点数の場合、最初の16進数桁は 0 になりません。 値が 0 であれば、指数も 0 になります。 精度は小数点以下の最小桁数を指定します。 デフォルトの精度は値を正確に表現するのに十分な値です。 代替表現では小数点の後に何もなくても小数点文字が書き込まれます。 無限大および非数の変換形式についてはノートを参照してください。

N/A N/A N/A N/A N/A N/A
g
G

浮動小数点数を値と精度に応じて10進数表記または10進数の指数表記に変換します。

g 変換の場合は e または f 形式の変換が行われます。 G 変換の場合は E または F 形式の変換が行われます。

P を非ゼロの場合は精度と等しい値、精度が指定されていない場合は 6、精度が 0 の場合は 1 と置いたとき、 E 形式の変換で指数が X である場合、

  • P > X ≥ −4 であれば、変換は f または F の形式と P − 1 − X の精度を持ちます。
  • そうでなければ、変換は e または E の形式と P − 1 の精度を持ちます。

代替表現が要求されなければ、末尾のゼロは削除され、小数点以下が残っていなければ、小数点文字も削除されます。 無限大および非数の変換形式についてはノートを参照してください。

N/A N/A N/A N/A N/A N/A
n

関数のこの呼び出しによってそれまでに書き込まれた文字数を返します。

結果は引数の指している値に書き込まれます。 仕様はフラグフィールド幅精度のいずれも含んでいてはいけません。

signed char*
short*
int*
long*
long long*
intmax_t*
signed size_t*
ptrdiff_t*
N/A
p

ポインタを定義する処理系定義の文字シーケンスを書き込みます。

N/A N/A void* N/A N/A N/A N/A N/A N/A

浮動小数点変換関数は無限大を inf または infinity に変換します。 いずれが使用されるかは処理系定義です。

非数は nan または nan(char_sequence) に変換されます。 いずれが使用されるかは処理系定義です。

変換 F, E, G, A は代わりに INF, INFINITY, NAN を出力します。

%cint 引数を期待しますが、可変長引数関数が呼ばれるときに行われる整数昇格のため、 char を渡しても安全です。

固定幅の整数型 (int8_t など) に対する正しい変換指定はヘッダ <cinttypes> で定義されています (PRIdMAX, PRIuMAX などは %jd, %ju などの同義語ですが)。

メモリに書き込む変換指定子 %n は、書式文字列がユーザ入力に依存する場合、セキュリティエクスプロイトのよくあるターゲットであり、境界チェック付きの printf_s ファミリーの関数ではサポートされていません。

変換指定子それぞれの動作後に副作用完了点があります。 これにより同じ変数に複数の %n の結果を格納することができ、またエッジケースとして、同じ呼び出しの中で先行する %n によって変更された値を表示することができます。

変換指定が無効な場合、動作は未定義です。


... - 表示するデータを指定する引数。 デフォルト変換後のいずれかの引数が対応する変換指定子の期待する型でない場合、または format が要求するより少ない引数しかない場合、動作は未定義です。 format が要求するより多くの引数がある場合、余分な引数は評価され、無視されます

[編集] 戻り値

1-2) 成功した場合は書き込まれた文字数、エラーが発生した場合は負の値。
3) 成功した場合は書き込まれた文字数 (終端のヌル文字は含みません)、エラーが発生した場合は負の値。
4) 成功した場合は十分に大きなバッファがあれば書き込まれたであろう文字数 (終端のヌル文字は含みません)、エラーが発生した場合は負の値。 そのため、戻り値が 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、ファイルストリームまたはバッファに書式付きワイド文字出力を行います
(関数) [edit]
可変個引数リストを使用して stdout、ファイルストリームまたはバッファに書式付き出力を行います
(関数) [edit]
ファイルストリームに文字列を書き込みます
(関数) [edit]
stdin、ファイルストリームまたはバッファから書式付き入力を行います
(関数) [edit]
(C++17)
整数値または浮動小数点値を文字シーケンスに変換します
(関数) [edit]
printf, fprintf, sprintf, snprintfC言語リファレンス