【課題1−22 scanfの注意点】

 

<空白類文字は読み込めない>

scanf関数では半角スペース,タブ,改行などの空白類を区切り文字として使う.

(例)  int i, j, k;

       scanf("%d%d%d", &i, &j, &k);

この例では,一つ入力するたびにEnterを押しても構わないが,

       10 20 30<enter>

のように空白を区切りにデータ入力をすることができる.逆に空白を入力データに含めることなできない.

空白を含む文字列を読み込むときにはgets関数を用いる.ただし,%c指定で文字を読み込むときに限り空白も入力できる.

 

<改行文字('¥n')が残る>

scanf関数では,正しく入力しても最後の改行は入力バッファに残るため,2度目以降の入力に%c指定をした場合,おかしな動作になる

(例)  scanf("%d", &a);

       scanf("%c", &c); // 入力できない

 

回避方法1:作業変数に'¥n'をダミー入力する

       scanf(...);

       scanf("%c",&dummy); //前に押された'¥n'がはいる

       scanf("%c", &c);     //本入力

 

回避方法2:getchar関数で読み捨てる

       scanf(...);

       (void)getchar();     //'¥n'の読み捨て

       scanf("%c", &c);     //本入力

 

回避方法3:代入抑制文字(*)を用いて,入力された'¥n'を変数に代入しない

       scanf(...);

       scanf("%*c%c", &c);  //'¥n'の代入阻止

 

回避方法4:" %c"で空白を読み飛ばす

       scanf(...);

       scanf(" %c", &c);    //空白類文字の読み捨て

 

<書式文字列に変換指定以外を書く場合>

書式文字列に変換指定以外の文字を書くと,その文字まで正確に入力しなくてはならない.

(例)  scanf("input=%d", &n);

        //input=10<enter>」のように入力しなくてはならない.

       scanf("%d¥n", &n);

        // 空白文字以外を入力するまで空白類文字を読み捨て続ける.

        // 数値の後にいくらEnterキーを押しても入力をやめられない.

       scanf("%d,%d", &n1, &n2);

        // 1,2<enter>」のようにカンマで区切った入力を要求

 

 

戻る