【问题标题】:problem with I/O exception in c++ ("cin" statement)c++ 中的 I/O 异常问题(“cin”语句)
【发布时间】:2011-10-01 06:39:49
【问题描述】:

在以下程序中:

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&gt;&gt;c”语句存在问题,但无法弄清楚为什么会这样。

【问题讨论】:

  • 当我从“invalid_argument”的捕获块中删除整个输入场景并只放置“break”语句时,程序运行良好。
  • 感谢 Kenny,我使用两个语句来清除 cin 流。 " std::cin.clear(); std::cin.ignore(80, '\n');"因为 "std::numeric_limits<:streamsize>::max()" 给出错误。程序现在运行良好

标签: c++ exception io cin


【解决方案1】:

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

  • 有问题的字符没有被消耗
  • std::cin 的失败位已设置。

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

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

【讨论】:

    【解决方案2】:

    你可以玩exception masks,你可能会找到更好的方法来处理错误。

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多