【課題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>」のようにカンマで区切った入力を要求