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

Can't get out of the do{}while(); loop (C++)

本文关键字:循环 C++ while do      更新时间:2023-10-16

出于某种奇怪的原因,我无法摆脱要求输入答案的循环,任何帮助都会很棒:

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

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

您在

阅读字符之前调用cin.ignore()

这将导致它忽略下一个输入字符(因为如果cin流只是坐在那里等待输入,则它没有 EOF)。 因此,您将始终获得"输入"而不是字母。

读取字符执行忽略,或者更好的是,使用 getline 读取字符串。

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

与其在

阅读之前做std::cin.ignore(),我建议在input是一个std::string的时候做一些类似std::cin >> inputstd::getline(std::cin,input)的事情。如果您坚持使用std::cin >> input那么您可能应该调用std::cin.ignore(20,'n');以丢弃换行符。