0

私が必要とするのは:

1) sscanf が行うように文字列から読み取る 2) sscanf が "%n" を使用して行うように、処理されたシーケンスの長さを測定する 3)format上記の引数とその他の引数を受け入れる (それを制御しない)

それを行う方法はありますか?

size_t read = 0; //Accumulator of the length of processed characters

void readfn (char* source_string, char* fmt, va_list args)
{
  int length;

  size_t fmtlen = strlen(fmt);

  char* fmt_and_lenght = (char*)realloc(fmt, fmtlen + 3);

  fmt_and_length[fmtlen]     = '%';
  fmt_and_length[fmtlen + 1] = 'n';
  fmt_and_length[fmtlen + 2] = '\0';

  va_list args_and_length = va_append(args, length); //here is the problem, i need to add &length to the list (i dont care if the list is created from scretch

  vsscanf(source_str, fmt_and_length, args_and_length); //here i finally capture the length of processed string

  read += length; //and i do whatever i wanted to do with it
}

fmtに「%n」が含まれておらず、引数リストが以前にそれをキャプチャしていなかったとしても、消費された文字数を単純にカウントしますか?

編集: vsnscanf があれば、処理された文字数を取得する名前があれば間違いなく良いでしょう。しかし、フォーマット文字列をエスケープされていない % で分割することでこれを解決しました。* が続かない場合は、1 つの引数をフェッチし、繰り返しすべての引数を処理します。そのたびに「%n」を追加し、最後に長さを合計します。

4

1 に答える 1

0

これを行う移植可能な方法はありません。これをまったく行う必要がないように、コードをリファクタリングすることをお勧めします。ffcall ライブラリと一緒に何かを組み立てることができるかもしれませんが、それは面倒で壊れやすいものです。

于 2012-10-17T21:41:42.900 に答える