无法摆脱do {} while();循环(C ++)

时间:2013-02-01 01:40:07

标签: c++ loops

由于一些奇怪的原因,我无法摆脱那个要求输入答案的循环,任何帮助都会很棒:

#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');
    }
}

编辑:更改了条件,我为此示例输错了。现在每个条件都有!=问题是一样的,它不能突破循环。我认为,如果其中一个条件为假,那么整个条件设置为false,从而导致它突然退出循环......但是,如果我输入A,B,它仍然会循环并且仍会显示验证消息,C或D ....是cin.get()的东西吗?我不想使用getline(),因为这不是本书所要求的。

2 个答案:

答案 0 :(得分:8)

在阅读字符之前,请致电cin.ignore()

这将导致它忽略 next 输入字符(因为cin流没有EOF,如果它只是坐在那里等待输入)。因此,您将始终获得“输入”而非信件。

在中读取字符后忽略,或者更好的是,使用getline读取字符串。

您可以通过显示已读取的字符(或其值)来解决此问题。标准调试实践:“为什么这个应该工作不起作用?”

答案 1 :(得分:2)

我建议您在阅读之前执行std::cin.ignore(),而不是std::cin >> inputstd::getline(std::cin,input),而inputstd::string。如果您坚持使用std::cin >> input,那么您应该拨打std::cin.ignore(20,'\n');来放弃换行符。