1

標準char*の文字列を使用する場合、snprintfand関数は、オーバーフローのためにその文字列が切り捨てられた場合でも、出力文字列の長さを返します。* ISO C委員会は、andvsnprintfを追加したときにこの機能を気に入らなかったようです。オーバーフロー時。swprintfvswprintf

この長さを提供する関数を知っている人はいますか?潜在的な文字列のサイズがわかりません。私はあまりにも多くを求めているかもしれませんが、..私はむしろしたくない:

  • 巨大な静的一時バッファを割り当てます
  • 適合するサイズが見つかるまで、メモリを繰り返し割り当てて解放します
  • ライブラリの依存関係を追加する
  • 独自のフォーマット文字列パーサーを作成する

* MSVCはこれを行わず、代わりにscprintfvscprintf関数を提供しますが、他のコンパイラ、主にGCCを探しています。

4

2 に答える 2

2

wchar_t特にWindows指向のコードを作成していない場合は、文字列をまったく使用しないことをお勧めします。それが選択肢ではない場合、ここにいくつかの他のアイデアがあります:

  1. フォーマット文字列自体に非ASCII文字が含まれていない場合は、最初vsnprintfに同じ引数のセットを使用してバイト単位の長さを取得し、それを文字単位の長さの安全な上限として使用しますwchar_t(数が少ないか、 -ASCII文字、境界は厳しくなります)。

  2. POSIX関数(C1xに追加される可能性が高い)への依存関係を導入しても問題がない場合は、とを使用open_wmemstreamfwprintfます。

  3. より大きなバッファの割り当てを繰り返すだけですが、賢く行います。各ステップでサイズを幾何学的に増やします。たとえば、127、255、511、1023、2047などです。危険なケースを簡単に回避できるため、このパターンは2の累乗よりも優れています。ここで、SIZE_MAX / 2 + 1の割り当ては成功する可能性がありますが、次の反復で0にラップされます。

于 2011-05-25T23:23:27.373 に答える
0

これにより、ワイド文字列のバッファサイズが返されます。

vswprintf(nullptr, -1, aFormat, argPtr);
于 2012-10-18T21:46:03.480 に答える