C++ 中的 I/O 异常问题("cin"语句)

problem with I/O exception in c++ ("cin" statement)

本文关键字:cin 语句 问题 异常 中的 C++      更新时间:2023-10-16

在以下程序中:

int main(){
    std::cout<<"enter numbers to be divide"<<std::endl;
    int a,b,c;
    while(true){
        try{
            if(!(std::cin>>a>>b)){
                throw std::invalid_argument("please enter proper interger");
            }
            if(b==0){
                throw std::runtime_error("please enter enter nonzero divisor");
            }
            c=a/b;
            std::cout<<"quotient = "<<c<<std::endl;
        }
        catch(std::invalid_argument e){
            std::cout<<e.what()<<"ntry again?enter y/n";
            char c;
            std::cin>>c;
            if(c=='n'||c=='N') break;
        }
        catch(std::runtime_error e){
            std::cout<<e.what()<<"ntry again?enter y/n";
            char c;
            std::cin>>c;
            if(c=='n'||c=='N') break;
        }
    }
    return 0;
}

我使用了两种异常。程序在抛出"runtime_error"异常时正常工作,但在遇到"invalid_argument"异常时进入无限循环。实际上catch-block中的"cin>>c"语句有问题,但不知道为什么会出现这种情况。

std::cin>>a>>b遇到非数字字符时,会发生两件相关的事情:

  • 违规字符不被消耗;
  • 设置std::cin失效位。

后者阻止所有从std::cin进一步读取成功。这包括在invalid_argument catch块中的那些和在循环的后续迭代中的那些。

要解决这个问题,您需要清除std::cin的状态并消耗违规字符。下面KennyTM给出的答案很好地解释了这一点:c++ character to int.

您可以使用异常掩码,您可能会找到更好的方法来处理错误。