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

フォーマット

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

言語レベル

ANSI

スレッド・セーフ

はい

ロケール依存

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

説明

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

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

戻り値

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

この例では、vscanf() 関数を使用して、stdin から整数、 浮動小数点値、文字、およびストリングを読み取り、それらの値を 表示します。
#include <stdio.h>
#include <stdarg.h>
int vread(char *fmt, ...)
{
   int rc;
   va_list arg_ptr;
   va_start(arg_ptr, fmt);
   rc = vscanf(fmt, arg_ptr);
   va_end(arg_ptr);
   return(rc);
}

int main(void)
{
   int i, rc;
   float fp;
   char c, s[81];
   printf("Enter an integer, a real number, a character "
   "and a string : ¥n");
   rc = vread("%d %f %c %s", &i, &fp, &c, s);
   if (rc != 4)
      printf("Not all fields are assigned\n");
   else
   {
      printf("integer = %d¥n", i);
      printf("real number = %f¥n", fp);
      printf("character = %c¥n", c);
      printf("string = %s¥n",s);
   }
}
/***************** If input is: 12 2.5 a yes, *******************
************** then output should be similar to: ****************
Enter an integer, a real number, a character and a string :
integer = 12
real number = 2.500000
character = a
string = yes
*/