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で除去することを意味する。