- ベストアンサー
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; } よろしくお願いします。長文失礼しました
- みんなの回答 (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; } (注)インデントのため、全角空白を使っています。
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
ガロン数を入力した際の[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; といった具合にするかです
補足
確認の為に、変更点は 「%c の前に空白が入った」ということで、よろしいでしょうか? 私の環境では、それで動作は思ったとおりになりました。 ありがとうございます。 もしよろしければ、なぜそれが改善に繋がったのかをご教示願えますか?