std::cin无限循环错误输入

std::cin infinite loop for wrong input

本文关键字:输入 错误 cin std 无限循环      更新时间:2023-10-16

在下面的代码中,我想循环直到用户提供正确的输入。但当我尝试的时候,它变成了一个不停的循环
Please Enter Valid Input.
如果没有while循环,它也是一样的。

此处带有while循环:

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <sstream>
using namespace std;
class library {
public:
    library() {
        int mainOption;
        cout<<"Please choose the option you want to perform."<<endl;
        cout<<"1. Member Section"<<"n"<<"2. Books, Lending & Donate Section"<<"n"<<"3. Returning Section"<<endl;
        bool option=true;
        while (option==true) {
            cin>>mainOption;
            if (mainOption==1) {
                cout<<"section 1"<<endl;
                option=false;
            } else if (mainOption==2) {
                cout<<"section 1"<<endl;
                option=false;
            } else if (mainOption==3) {
                cout<<"section 1"<<endl;
                option=false;
            } else {
                cout<<"Please Enter Valid Input. "<<endl;
                //option still true. so it should ask user input again right?
            }
        }
    }
};
int main(int argc, const char * argv[])
{
    library l1;
    return 0;
}

这里没有while循环。但同样的事情正在发生。

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <sstream>
using namespace std;
class library {
public:
    library() {
        int mainOption;
        cout<<"Please choose the option you want to perform."<<endl;
        cout<<"1. Member Section"<<"n"<<"2. Books, Lending & Donate Section"<<"n"<<"3. Returning Section"<<endl;
        cin>>mainOption;
        if (mainOption==1) {
            cout<<"section 1"<<endl;
        } else if (mainOption==2) {
            cout<<"section 1"<<endl;
        } else if (mainOption==3) {
            cout<<"section 1"<<endl;
        } else {
            cout<<"Please Enter Valid Input. "<<endl;
            library();//Calling library function again to input again.
        }
    }
};
int main(int argc, const char * argv[])
{
    library l1;
    return 0;
}

问题是当您调用时

cin>>mainOption; // mainOption is an int

但是用户不输入intcin使输入缓冲器处于旧状态。除非您的代码消耗了输入的无效部分,否则最终用户输入的错误值将保留在缓冲区中,从而导致无限重复。

以下是解决此问题的方法:

} else {
    cout<<"Please Enter Valid Input. "<<endl;
    cin.clear(); // Clear the error state
    string discard;
    getline(cin, discard); // Read and discard the next line
    // option remains true, so the loop continues
}

注意,我还删除了递归,因为while循环足够好,可以处理手头的任务。