scanf,wscanf

提供:RAD Studio (日本語)
移動: 案内, 検索

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


ヘッダーファイル

stdio.h

カテゴリ

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

プロトタイプ

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

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

説明

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

メモ:  Win32 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);  /* 不正な入力の場合は,入力ストリームをフラッシュします */
 /* エントリ数を int で入力します */
   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);  /* 不正な入力の場合は,入力ストリームをフラッシュします */
 /* 年齢を int で入力します */
       printf("  Age    : ");
       scanf("%d", &entry[loop].age);
       fflush(stdin);  /* 不正な入力の場合は,入力ストリームをフラッシュします */
 /* 給与を float で入力します */
       printf("  Salary : ");
       scanf("%f", &entry[loop].salary);
       fflush(stdin); /* 不正な入力の場合は,入力ストリームをフラッシュします */
    }
 /* 名前,年齢,給与をそれぞれ文字列,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;
 }
他言語版