vsprintf | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


vsprintf関数

概要

変換指定に沿って変換された文字列を格納する。

ヘッダ

stdio.h

形式

int vsprintf(char* restrict s, const char* restrict format, va_list args);

引数

s

結果を格納するメモリアドレス。

format

変換指定を含んだ、あるいは含まないプレーンな文字列。

args

format に含まれている変換指定子に対応した、可変個引数リスト。

戻り値

正常に終了した場合は、出力した文字数が返される(末尾のヌル文字は含まない)。エラー発生時は負数が返される。

詳細

仮引数が … から va_list に変わったことを除き、sprintf関数と同等である。
変換指定の詳細については、printf関数を参照。

注意

第3引数に渡すva_list型のオブジェクトは、事前に va_start による初期化が必要である。

va_list に、必要な個数の引数が含まれていない場合の動作は未定義。余分に存在している場合には、評価は行われるが、vsprintf関数としては無視する。

この関数は内部で va_argマクロを呼び出すため、関数から戻った後の args の状態は不定である。

結果を配列へ格納するため、vprintf関数と異なり、バッファオーバーフローの可能性を配慮しなければならない。変換指定子を複数使うケースでは、丁寧に最大文字数を考える必要があり、安全に使うことは難しい。

使用例

#include <stdio.h>
#include <stdarg.h>

static void warning(char* buf, const char* str, ...);

int main(void)
{
    char buf[256] = "";
    int value = 100;

    if (value != 0) {
        warning(buf, "value: %d\n", value);
    }

    puts(buf);
}

void warning(char* buf, const char* str, ...)
{
    va_list args;

    va_start(args, str);

    sprintf(buf, "[WARNING] ");
    vsprintf(buf, str, args);

    va_end(args);
}

実行結果:

[WARNING] value: 100

関連

標準出力への出力に特化した vprintf関数がある。任意のストリームへ出力するには vfprintf関数を使う。
va_list の代わりに、… を用いたバージョンとして、sprintf関数がある。
ワイド文字版の vswprintf関数がある。ただし、vswprintf関数には出力する文字数の上限指定が含まれており、引数の形式が異なる。

解説章


参考リンク


更新履歴

’2018/4/22 解説中で C95 を(C89 に対して)特別扱いしないように修正。そもそもC言語編は C95ベースなので、余計な説明は省く。

’2018/4/19 全体的に文章を見直し修正。

’2018/2/22 「サイズ」という表記について表現を統一。 型のサイズ(バイト数)を表しているところは「大きさ」、要素数を表しているところは「要素数」。

’2018/2/1 C言語編全体で表記を統一するため、「フォーマット指定」を「変換指定」に改めた。

’2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る