Previous: 効率のよいプログラム開発
Up: 入力の読み込みと制御構造
Previous Page: 効率のよいプログラム開発
Next Page: 制御構造と論理演算

復習

  1. 整数変数の標準入力からの読み込み
    標準入力(ユーザーがリダイレクトしなければ、キーボード)からの読み込み には、scanf を用い、その書式は次の通りである。

    書式    scanf("%d", &整数変数)

    例
                    int a;
                    scanf("%d", &a);
    例では、整数変数 a に標準入力から一個の整数を読み込む。

  2. scanf のエラー処理
    scanf は、期待した形式(上の場合は整数)以外のものが入力された場合、 0 を返す。入力が正常に行われた場合は、読み込んだ個数(上の場合は1個) を返す。従って、次の例の様に scanf の返り値を元に入力を検査できる。
    int a;
                    if (scanf("%d",&a)==0){
                            printf("Error!\n");
                    }else{
                            printf("正常入力\n");
                    }

  3. scanf での読みとりエラーと標準入力 scanf は入力エラーの場合は、標準入力にそのデータを返却する。 入力にデータを返すというと奇異に感じるが、実は、入力データは 一旦システムのある場所に貯められているので、その貯蔵庫に返却 するという意味である。従って、以下のようなプログラムは結果的に無限 ループになる。
    int a;
                    printf("a = ");
                    for (; scanf("%d", &a)==0 ;){
                            printf("入力エラー 再入力してください。\n a = ");
                    }
    入力貯蔵庫から取り出して、エラーの場合はそれを返却するので、 入力貯蔵庫との間でキャッチボールを永遠に続けるのである。

    この問題を解消するには、エラーの場合は、入力貯蔵庫を空にすれば良い。 そのための関数は、fflush() である。fflush の引数には、今の場合、 標準入力を指定するので、fflush(stdin) とする。従って、先の例は、

    int a;
                    printf("a = ");
                    for (; scanf("%d", &a)==0 ;){
                            fflush(stdin);
                            printf("入力エラー 再入力してください。\n a = ");
                    }
    とすれば、無限ループを解消できる。

  4. 実行プログラムの名前を付ける
    a.out 以外の名前を実行プログラムにつけるには、コンパイル時に以下の ようにすれば良い。
    $ cc   -o    実行ファイル名  ソースファイル名
            例
                    $ cc  -o  test  test.c

maruyama@wakhok.ac.jp
1995年02月08日 (水) 18時57分57秒 JST