1

次のプログラムでは:

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;
}

2種類の例外を使用しています。プログラムは「runtime_error」例外をスローすると完全に機能しますが、「invalid_argument」例外が発生すると無限ループになります。実際、catch-blockの ""ステートメントに問題がありcin>>cますが、なぜこれが発生しているのか理解できません。

4

2 に答える 2

3

std::cin>>a>>bが数字以外の文字に遭遇すると、次の 2 つの関連することが起こります。

  • 問題のある文字は消費されません
  • のフェイル ビットstd::cinがセットされます。

後者は、それ以降のすべての読み取りがstd::cin成功するのを防ぎます。これには、invalid_argumentcatch ブロック内のものと、ループの後続の反復内のものが含まれます。

これを修正std::cinするには、問題のあるキャラクターの状態をクリアして消費する必要があります。これは、KennyTM によって指摘された次の回答で非常によく説明されています: C++ character to int

于 2011-07-08T13:16:14.663 に答える
0

例外マスクで遊ぶことができます。エラーを処理するための好ましい方法が見つかるかもしれません。

于 2011-07-08T13:27:56.013 に答える