vsnprintf | Programming Place Plus C言語編 標準ライブラリのリファレンス
Programming Place Plus トップページ – C言語編 – 標準ライブラリのリファレンス(名前順)
Programming Place Plus トップページ – C言語編 – 標準ライブラリのリファレンス(ヘッダ別)
概要 |
変換指定に沿って変換された文字列を、指定文字数以下だけ格納する。 |
|
ヘッダ |
||
形式 |
int vsnprintf(char* restrict s, size_t n, const char* restrict format, va_list args); |
|
引数 |
s |
結果を格納するメモリアドレス。 |
n |
終端に書き込まれる ‘\0’ を含めた、格納する最大文字数。 |
format |
変換指定を含んだ、あるいは含まないプレーンな文字列。 |
args |
format に含まれている変換指定子に対応した、可変個引数リスト。 |
|
戻り値 |
実際に書き込まれた文字数(末尾のヌル文字を除く)を返す。エラーが発生した場合は、負数を返す。 |
|
詳細 |
仮引数が … から va_list
に変わったことを除き、snprintf関数と同等である。 |
|
注意 |
第3引数に渡す va_list型のオブジェクトは、事前に va_start による初期化が必要である。 va_list に、必要な個数の引数が含まれていない場合の動作は未定義。余分に存在している場合には、評価は行われるが、vsnprintf関数としては無視する。 この関数は内部で va_argマクロを呼び出すため、関数から戻った後の args の状態は不定である。 この関数がバッファオーバーフローを防ぐ安全な関数であるかのように思われていることがあるが、そうではなく、やはりバッファオーバーフローは起こり得る。引数n に、配列の要素数以下の値を確実に指定することが必要である。バッファオーバーフローが起きていることを戻り値で確認できるものの、事後確認になってしまうので、すでにメモリは破壊されてしまっており、もはや手遅れである。プログラムの実行をただちに停止させることを試みることくらいしかできないだろう(それすらもできないかもしれないが)。 |
|
使用例 |
実行結果:
|
|
関連 |
命名規則が合致していないが、ワイド文字版は vswprintf関数である。vsnwprintf のような名前の標準関数はない。
|
|
解説章 |
return 0;
を削除(C言語編全体でのコードの統一)’2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。
’2018/4/19 全体的に文章を見直し修正。
「詳細」「注意」を加筆。
’2018/2/1 C言語編全体で表記を統一するため、「フォーマット指定」を「変換指定」に改めた。
’2018/1/22 新規作成。
Programming Place Plus のトップページへ