vsscanf() — フォーマット済みデータの読み取り

フォーマット

#include <stdarg.h>
#include <stdio.h>
int vsscanf(const char *buffer, const char *format, va_list arg_ptr);

言語レベル

ANSI

スレッド・セーフ

はい

ロケール依存

この関数の振る舞いは、現行ロケールの LC_CTYPE カテゴリーおよび LC_NUMERIC カテゴリーの影響を受ける可能性があります。また、この振る舞いは、LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) がコンパイル・コマンドに対して指定されている場合は、現行ロケールの LC_UNI_CTYPE カテゴリーの影響を受ける可能性もあります。詳細については、CCSID およびロケールの理解を参照してください。

説明

vsscanf() 関数は、バッファーから引数の可変値で指定されたロケーションへ データを読み取ります。vsscanf() 関数は、sscanf() 関数と同様に機能しますが、arg_ptr はプログラムの呼び出しによって個数が異なることがある引数のリストを指しているという点が異なります。これらの引数は、 各呼び出しごとに va_start で初期化する必要があります。 反対に、sscanf() 関数は引数のリストを持てますが、 そのリストの引数の数はプログラムをコンパイルしたときに決定されます。

各引数は、format-string の型指定子に対応する型を持つ変数へのポインター でなければなりません。format には、 scanf() 関数の書式ストリングと同じ書式および関数があります。

戻り値

vsscanf() 関数は、正常に変換され、割り当てられたフィールドの数を 戻します。戻り値には、読み取りは行われたが、割り当てられなかったフィールドは含まれません。変換が行われていない場合に、ファイルの終わりを読み取ろうとすると、戻り値は EOF になります。戻り値 0 は、フィールドが割り当てられなかったことを 意味します。

この例では vsscanf() を使用して、ストリング tokenstring からさまざまなデータを読み取り、 そのデータを表示します。
#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>

int vread(const char *buffer, char *fmt, ...)
{
   int rc;
   va_list arg_ptr;
   va_start(arg_ptr, fmt);
   rc = vsscanf(buffer, fmt, arg_ptr);
   va_end(arg_ptr);
   return(rc);
}
int main(void)
{
   char *tokenstring = "15 12 14";
   wchar_t * idestring = L"ABC Z";
   wchar_t ws[81];
   wchar_t wc;
   int i;
   float fp;
   char s[81];
   char c;
   /* Input various data */
   /* In the first invocation of vsscanf, the format string is */
   /* "%s %c%d%f". If there were no space between %s and %c, */
   /* vsscanf would read the first character following the */
   /* string, which is a blank space. */
   vread(tokenstring, "%s %c%d%f", s, &c, &i, &fp);
   vread((char *) idestring, "%S %C", ws,&wc);
   /* Display the data */
   printf("\nstring = %s\n",s);
   printf("character = %c\n",c);
   printf("integer = %d\n",i);
   printf("floating-point number = %f\n",fp);
   printf("wide-character string = %S\n", ws);
   printf("wide-character = %C\n", wc);
}
/***************** Output should be similar to: *****************
string = 15
character = 1
integer = 2
floating-point number = 14.000000
wide-character string = ABC
wide-character = Z
*******************************************************************/