-3

いくつかの奇妙な理由で、答えを入力するように求めるループから抜け出すことができません。どんな助けでも素晴らしいでしょう:

#include <iostream>
using namespace std;

int main(){
    const int TEST=20;
    char crctAnswrs[TEST]={'B', 'D', 'A', 'A', 'C',
                           'A', 'B', 'A', 'C', 'D',
                           'B', 'C', 'D', 'A', 'D',
                           'C', 'C', 'B', 'D', 'A'};
    char stdntAnswer[TEST];

    for(int index=0; index<TEST; index++){
        do{
            cout<<"Please enter the answer for question #"<<(index+1)<<": ";
            cin.ignore();
            char input;
            cin.get(input);
            stdntAnswer[index]=input;
            if(stdntAnswer[index]!='A' && stdntAnswer[index]!='B' &&
               stdntAnswer[index]!='C' && stdntAnswer[index]!='D'){
                cout<<"Please enter A, B, C, or D as an answer."<<endl;
            }
        }while(stdntAnswer[index]!='A' && stdntAnswer[index]!='B' &&
               stdntAnswer[index]!='C' && stdntAnswer[index]!='D');
    }
}

編集:条件を変更しました。この例では間違って入力しました。すべての条件に!=問題があり、ループから抜け出すことはできません。条件の1つが偽の場合、条件セット全体が偽であるため、ループから抜け出すと思います...ただし、A、Bを入力すると、ループが発生し、検証メッセージが表示されます。 、C、またはD .... cin.get()を使用したものですか?getline()は本が求めているものではないので、使いたくありません。

4

2 に答える 2

8

cin.ignore()文字を読む前に呼び出します。

これにより、次の入力文字が無視されます (cinストリームが入力を待っているだけの場合、ストリームに EOF がないため)。そのため、文字の代わりに常に「enter」が表示されます。

文字を読み取った後に無視するか、文字列を読み取るために使用することをお勧めgetlineします。

読み取った文字 (またはその値) を表示することで、これを解決できたはずです。標準的なデバッグ方法: 「動作するはずのものが動作しないのはなぜですか?」

于 2013-02-01T01:47:17.373 に答える
2

読む前にやるのではなく、やwhile is an のstd::cin.ignore()ようなことをすることをお勧めします。固執する場合は、おそらく改行を破棄するように呼び出す必要があります。std::cin >> inputstd::getline(std::cin,input)inputstd::stringstd::cin >> inputstd::cin.ignore(20,'\n');

于 2013-02-01T01:42:45.150 に答える