0


Win32およびLinuxで、フォーマットされたバッファに必要な文字数(nulバイトを含まない)を返す関数count_sprintf()が必要です。

int count_sprintf(const char *format, va_list ap);

フォーマットされた値がバッファサイズよりも長い場合、vsnprintfの戻り値にはWin32とLinuxの間に微妙な違いがあります。だから私は助けを求めます。

この関数のポータブルコード(#ifdef WIN32)を教えてください。

このように使用される関数:

int bufsize = 1 + count_snprintf(format, ap);  
char *buf = (char*)malloc(bufsize);  
vsnprintf(buf, bufsize, format, ap); // on WIN32, _vsnprint, on Linux, vsnprintf.

ありがとう

4

4 に答える 4

3

VSランタイムには、必要な文字数をカウントする_vscprintfがあります。

int count_sprintf(const char *format, va_list ap) {
#ifdef WIN32
  return _vscprintf(format, ap);
#else
  char c;
  return vsnprintf(&c, 1, format, ap);
#endif
}
于 2011-03-03T18:04:04.740 に答える
1

Cソリューション、C ++、またはその両方が必要かどうかわかりません。

C ++では、この問題を解決する非常に簡単な方法がprintfあります。関数の行の代わりにストリームを使用します。

CIでは、可変フォーマット文字列を使用する場合は慎重に検討することをお勧めします。関数のvarargsが少しでもずれていて、コンパイラが支援する方法がない場合、問題が発生する可能性があります。フォーマットが外部で生成された場合、基本的にバッファオーバーフローのエクスプロイトがいくつも発生する可能性があるため、状況はさらに悪化します。少なくとも、固定フォーマット文字列がある場合は、開始するまでの時間がわかります。一部のコンパイラは、varargsでフォーマット文字列チェックを実行できます。

于 2011-03-03T17:57:23.290 に答える
0

これにはvsnprintfを使用できます。サイズ0のバッファーを指定すると、実際にはバッファーに何も入れようとしませんが、出力される文字数は返されます。

于 2011-03-03T18:41:34.260 に答える
0

Linuxでは以下を使用できますasprintf

   The  functions asprintf() and vasprintf() are analogs of sprintf(3) and
   vsprintf(3), except that they allocate a string large  enough  to  hold
   the output including the terminating null byte, and return a pointer to
   it via the first argument.  This pointer should be passed to free(3) to
   release the allocated storage when it is no longer needed.
于 2011-03-03T17:51:34.967 に答える