4

私は機能を持っています:

static int myprintf(const char* fmt, ...)

すべての myprintf 引数のバイト単位のサイズを知りたいのですが、それらがバッファに出力された場合です。引数を出力できる配列を動的に割り当てる必要があります ( sprinforを使用_vsprinf) たとえば、32 ビット OS では、myprintf("%d %c",10,'a'); myprintf 引数のサイズは 5 です。

私はそれを次のように実装しようとしました:

va_list ap;

va_start(ap, fmt);

myArgSize(ap);

誰かが myArgSize の実装方法をアドバイスできますか?

このようなことを試してみてくださいと言われました

char c;
int len = ::_vsnprintf(&c, 1, fmt, ap);

複数のバイトが書き込まれているため、機能しません。しかし、おそらくいくつかの回避策があります。

ありがとう

4

4 に答える 4

1

質問の多くはトライアド関数に渡される引数のサイズに関するものですが、実際には、出力バッファーの大きさに関心があるようです。次のようなものを試してください。

va_list ap;

va_start(ap, fmt);

int len = ::vsnprintf( NULL, 0, fmt, ap);
if (len < 0) abort();

char* buffer = (char*) malloc( len + 1);
if (!buffer) abort();

::vsnprintf( buffer, len+1, fmt, ap);

va_end();

ただし、プラットフォームにC99標準に準拠していない場合vsnprintf()(たとえば、MSVC)、いくつかの調整を行う必要があります。MSVCの場合推測でサイズ設定されたバッファーを渡してみて(strlen(fmt)+1 + (10 * number_of_percent_signs_in_fmt)または、ケースの99%をカバーするサイズで開始する場合もあります200)、機能するまで推測を増やします。または、snprintf()HolgerWeissによる関数ファミリーのようなものを試すこともできます。

于 2012-04-24T15:10:41.713 に答える
1

ええと...引数の型と順序に関する唯一の情報は最初の引数にあります。それが必要な理由です。

printf()ような関数の場合、フォーマット文字列をステップ実行し、各%コードを解析し、対応する型のサイズを追加する必要があります。それは些細なことではありません。ではなく%hdを期待するのようなものを処理することを忘れないでください。また、値が可変個引数関数に渡されるときに発生する変換があります。shortint

于 2012-04-24T12:22:00.310 に答える
1

を使用vasprintfして、適切なサイズのバッファーにすべての書式設定を行うことができます。これは割り当てられます (必要になりますfree)。

または、vsnprintf文字列の長さを取得するために使用できprintfます。

int n = vsnprintf(NULL, 0, fmt, args);

これは、十分なスペースがある場合に出力されるバイト数を返すためです。この場合、何も出力できませんが、とにかく番号を返します。

于 2012-04-24T14:55:30.567 に答える
-2

sizeof(type_name)を使用し、forループを使用してすべての引数を移動できます。type_nameは、int、float、longなどのcデータ型のいずれかです。次に、すべてのバイトを追加します。

于 2012-04-24T12:30:16.633 に答える