ショッピングモール  Personal Health / Men's Health ( Infertility )


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.4871

sprintfの出力バイト数を予め知るには
投稿者---chu-(2005/11/18 11:49:30)


Win98,LSI-C

修学の為、VCLのAnsiStringをお題に、Cで同じ動きをするものを書いています。

AnsiString::sprintfのようなTMyString_SetPrintFormatを書いていて詰まってしまいました。
現在は下記のようになっています。
buf[256]と、文字列長に上限があるのが気に入りません。

typedef struct {
    char    *Buffer;
    size_t  Size;
} TMyString;

int TMyString_SetPrintFormat(TMyString *This, const char *Format, ...)
{
    va_list arg;
    char    buf[256];
    int     len;

    va_start(arg, Format);
    len = vsprintf(buf, Format, arg);
    va_end(arg);

    This->Size = len + 1;
    This->Buffer = realloc(This->Buffer, sizeof(char) * This->Size);

    memcpy(This->Buffer, buf, This->Size);

    return len;
}

いい方法が思いつかないので解答を見てみると下記のようになっていました。
vsnprintfの戻り値は出力したバイト数で、第二引数に0を指定することによってバッファに書込まなくできるようです。
しかし、標準にvsnprintfはありません。
sprintfも戻り値は出力したバイト数なので、sprintfの第一引数にNULLを渡したらどうかと
考えましたが、規格(JIS-X3010)を見てもNULLの場合の記述はありませんでした。

  int __cdecl AnsiString::vprintf(const char* format, va_list paramList)
  {
    int size = vsnprintf(NULL, 0, format, paramList);
    SetLength(size);
    return vsnprintf(Data, size, format, paramList);
  }

sprintfの第一引数のバッファに必要なサイズを予め知るにはどうすればよいでしょうか。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:sprintfの出力バイト数を予め知るには 4872 YuO 2005/11/18 12:38:18


No.4872

Re:sprintfの出力バイト数を予め知るには
投稿者---YuO(2005/11/18 12:38:18)


> いい方法が思いつかないので解答を見てみると下記のようになっていました。
> vsnprintfの戻り値は出力したバイト数で、第二引数に0を指定することによってバッファに書込まなくできるようです。
> しかし、標準にvsnprintfはありません。

ありますよ。ISO/IEC 9899:1999で新たに追加された関数として,vsnprintfがあります。
# LSI-Cにはないかもしれませんが。


> sprintfも戻り値は出力したバイト数なので、sprintfの第一引数にNULLを渡したらどうかと
> 考えましたが、規格(JIS-X3010)を見てもNULLの場合の記述はありませんでした。

第一引数が空ポインタ定数の場合,当然未定義動作です。
おそらく,空ポインタアクセスで例外が発生するでしょう。


> sprintfの第一引数のバッファに必要なサイズを予め知るにはどうすればよいでしょうか。

方法は存在しません。
だからこそ,C99でsnprintfが追加になりましたし,
C95で追加されたswprintfは最初から第二引数がsize_tです。

ちなみに,MFCのCString::Formatの古い実装では,
書式文字列を自分で解析しています。
# VC++2005の実装では,vsprintfやvsprintf_sを利用している。



この投稿にコメントする

削除パスワード

No.4873

Re:sprintfの出力バイト数を予め知るには
投稿者---chu-(2005/11/18 17:10:02)


納得できました。
ありがとうございます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧




掲示板提供:Real Integrity