• ベストアンサー

C初心者です。どうかお助けを

独習Cという本で独学中なのですが #include<stdio.h> int main() { int a,b; char ch; printf("実行したい演算は\n"); printf("加算(A)、減算(S)、乗算(M)、除算(D)のどれですか\n"); do{ printf("アルファベットの1文字を入力してください:"); ch=getchar(); while(getchar()!='\n'); }while(ch!='A' && ch!='S' && ch!='M' && ch!='D'); printf("\n"); printf("最初の数字を入力してください:"); scanf("%d",&a); printf("二つめの数字を入力してください:"); scanf("%d",&b); switch(ch){ case 'A': printf("%d",a+b); break; case 'B': printf("%d",a-b); break; case 'C': printf("%d",a*b); break; case 'D': if(b!=0)printf("%d",a/b); } return 0; } このプログラムでの14行目の while(getchar()!='\n');の必要性がわかりません。 どなたか有識者の方の回答をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

標準入力のバッファを空にするために 改行文字まで読み捨てているのだと思います。 試しに、そのwhileの行を削除したプログラムで 「アルファベットの1文字を入力してください:」 の時に"A100"と入力してみてください。 "A"をgetcharで読み込んだ後も バッファに"100"が残るので 「最初の数字を入力してください:」 の時に勝手に100が入力されたような挙動を示すと思います。 このバッファに文字が残るという挙動はscanfにもあります。 (たぶんこっちの方が有名でしょう。) http://www9.plala.or.jp/sgwr-t/c/sec05.html#s5-4 getcharについては検索してみたらこんな文章が見つかりました。 http://www5a.biglobe.ne.jp/~wired/life2001.htm#febrary7

poder
質問者

お礼

なるほど! 例がわかりやすかったです。ちゃんとなっとくできました。本当にありがとうございました。

その他の回答 (2)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

ANo.1で > やはり"\n"ですからEnterKeyの入力した場合どうするか?の判断だと思います。もしその行をコメントアウトしてEnterを押すと、 > また「アルファベットの1文字を入力してください」がでてきますが、while(getchar()!='\n'); があることにより防止できます。 といわれていますが、 これはたまたまそうなったという気がします。 何も入力せずにEnterキーを押すと > ch=getchar(); の部分で改行文字が読み込まれてしまうため、次の > while(getchar()!='\n'); で再び入力待ちの状態になりそのような挙動になったのでしょう。 ここでさらにEnterキーを押すとdo-whileループの先頭に戻り 再び「アルファベットの1文字を入力してください」が出てきます。 たぶん最初の > ch=getchar(); で入力内容を全て取得してしまう、つまり改行文字だけが入力されることを 想定していなかったのではないでしょうか。

noname#209802
noname#209802
回答No.1

あっているかどうかわかりませんが、私が今コンパイル+実行してみたカンジでは、やはり"\n"ですからEnterKeyの入力した場合どうするか?の判断だと思います。もしその行をコメントアウトしてEnterを押すと、また「アルファベットの1文字を入力してください」がでてきますが、while(getchar()!='\n'); があることにより防止できます。 たぶん...

poder
質問者

お礼

素早い回答ありがとうございました。 他の解答と合わせるとちょうど良く理解できました。 これでなっとくして次へ進めます。ありがとうございます。

関連するQ&A