• ベストアンサー

doループ内での scanf

Visual C++ win32 console application でC言語の勉強をしています 制御文に入ったところで、scanf文が無視され、プログラムが進んでいく という事態に直面して困っています。 どなたか下記のプログラムの間違いを指摘してください あるいは  言語仕様についてご教示ください 以下、まるまるコピーします #include<stdio.h> int main(void) { int g; char ch; do{ printf("何ガロンですか?: "); scanf("%d", &g); printf("%.2fリットルです\n", (3.7854)*g); printf("また計算しますか?Y/N : "); scanf("%c", &ch); printf("%c\n", ch); }while(ch == 'Y'); return 0; } よろしくお願いします。長文失礼しました

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

標準入力に対してfflushするのは未定義動作だと聞いたような覚えがあります。 そこで、こんな風に修正するのがよいかもしれません。 #include <stdio.h> int main(void) {   int g;   char ch;      do {     printf("何ガロンですか?: ");     scanf("%d", &g);     printf("%.2fリットルです\n", 3.7854 * g);     printf("また計算しますか?Y/N : ");     scanf(" %c", &ch);   } while(ch == 'Y' || ch == 'y');   return 0; } (注)インデントのため、全角空白を使っています。

zizou0911
質問者

補足

確認の為に、変更点は 「%c の前に空白が入った」ということで、よろしいでしょうか? 私の環境では、それで動作は思ったとおりになりました。 ありがとうございます。 もしよろしければ、なぜそれが改善に繋がったのかをご教示願えますか?

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ガロン数を入力した際の[Enter]キーの入力がバッファに残っているため scanf("%c",&ch); でEnterキーが入力されてしまいます そして whileの条件が不成立になりプログラムが終了します fflash(stdin); をscanf("%c",&ch);の手前に挿入してみてください scanfで取得した chが小文字のときの対処をしたほうが良いでしょうね while( ch == 'Y' || ch == 'y' ); とするか ch -= ( ch >= 'a' && ch <= 'z' ) ? 0x20 : 0; といった具合にするかです

関連するQ&A