scanf %cが入力できない問題

Cでハマってしまったのでメモ(こぴぺ)

 

入力が文字(char)の場合、主にキーボードで入力の際に押されるリターンキーが無視できないという問題点がある。例えば

char a, b, c;
scanf("%c", &a);
scanf("%c", &b);
scanf("%c", &c);

とした場合、通常なら3回入力待ちが行われることが期待されていると思われるが、実際には2回しか行われない(予期しない入力はここでは考慮しない)。これは最初の a の入力には入力された文字が代入されるが、このときストリーム上に改行コードが残されてしまい、次の bには aを入力する際に押下されたリターンキーの改行コードが代入されるためである。通常の %d や %s の場合改行コードは無視して入力を読み込むので問題にはならないが、 %c の場合は無条件にストリーム上の次のバイトを返すためこのような現象が発生する。これを防ぐには、

scanf("%c", &a);
scanf(" %c", &b);
scanf(" %c", &c);

のように最初に空白を入れることで回避される。これは入力前に空白(改行コードも含む)を読み飛ばすことを意味している。ただしこの場合 a, b, cに半角スペースを代入することはできない。そのような場合としては

scanf("%c%*c", &a);
scanf("%c%*c", &b);
scanf("%c%*c", &c);

という方法がとられる。これは入力した際の改行文字を%*cで除去することを意味する。

scanf - Wikipedia