scanf, wscanf

提供: RAD Studio
移動先: 案内検索

Stdio.h:インデックス への移動


ヘッダー ファイル

stdio.h

カテゴリ

コンソール入出力ルーチン

プロトタイプ

 int scanf(const char *format[, address, ...]);
 int wscanf(const wchar_t *format[, address, ...]);

説明

stdin ストリームからの入力を、スキャンおよび書式設定します。

メモ: Win32 および Win64 GUI アプリケーションの場合、stdin はリダイレクトする必要があります。

scanf 関数は:

  • 一連の入力フィールドを、一度に 1 文字ずつスキャンします。
  • 書式文字列*format で渡される書式指定子に従って、各フィールドを書式設定します。
  • vsscanf は、引数リストを使用して、文字列から入力をスキャンおよび書式設定します。

各入力フィールドに対して、それぞれ 1 つの書式指定子とアドレスが必要となります。

scanf は、通常のフィールド終了文字(空白)に到達する前に特定のフィールドのスキャンを停止したり、あるいは、処理を完全に終了することがあります。これがなぜ起こるかについては、「...scanf がスキャンを停止する場合」を参照してください。

メモ:scanf は、期待されるパターンと異なる場合に、予期しない結果を招くことがあります。scanf には、行の終わりでどのように同期するかを示す、提供しなければなりません。

gets または fgets に続けて sscanf を使用する組み合わせは、安全かつ簡単なので、scanf よりも推奨されます。

戻り値

成功すると、scanf は、スキャン、変換、格納が成功した入力フィールドの数を返します。 戻り値には、スキャンされたが格納されなかったフィールドは含まれません。

エラーの場合:

  • 格納されたフィールドがなければ、scanf は 0 を返します。
  • scanf は、ファイルの終わりまたは文字列の終わりを読み取ろうとした場合、EOF を返します。

scanf の詳細

 #include <stdio.h>
 int main(void)
 {
    char label[20];
    char name[20];
    int entries = 0;
    int loop, age;
    double salary;
    struct Entry_struct
    {
       char  name[20];
       int   age;
       float salary;
    } entry[20];
 /* ラベルを 20 文字制限の文字列で入力 */
    printf("\n\nPlease enter a label for the chart: ");
    scanf("%20s", label);
    fflush(stdin);  /* 不正な入力の場合、入力ストリームをフラッシュ */
 /* エントリ数を整数で入力 */
   printf("How many entries will there be? (less than 20) ");
   scanf("%d", &entries);
   fflush(stdin);   /* 不正な入力の場合、入力ストリームをフラッシュ */
 /* 大文字または小文字に制限して名前を入力 */
    for (loop=0;loop<entries;++loop)
    {
       printf("Entry %d\n", loop);
       printf("  Name   : ");
       scanf("%[A-Za-z]", entry[loop].name);
       fflush(stdin);  /* 不正な入力の場合、入力ストリームをフラッシュ */
 /* 年齢を整数で入力 */
       printf("  Age    : ");
       scanf("%d", &entry[loop].age);
       fflush(stdin);  /* 不正な入力の場合、入力ストリームをフラッシュ */
 /* 給与を浮動小数で入力 */
       printf("  Salary : ");
       scanf("%f", &entry[loop].salary);
       fflush(stdin); /* 不正な入力の場合、入力ストリームをフラッシュ */
    }
 /* 名前(string)、年齢(int)、給与(double)を入力 */
    printf("\nPlease enter your name, age and salary\n");
    scanf("%20s %d %lf", name, &age, &salary);
 /* 入力されたデータを出力 */
    printf("\n\nTable %s\n",label);
    printf("Compiled by %s  age %d  $%15.2lf\n", name, age, salary);
    printf("-----------------------------------------------------\n");
    for (loop=0;loop<entries;++loop)
       printf("%4d | %-20s | %5d | %15.2lf\n",
          loop + 1,
          entry[loop].name,
          entry[loop].age,
          entry[loop].salary);
    printf("-----------------------------------------------------\n");
    return 0;
 }

関連項目