2011-07-08 9 views
1

:それは「runtime_error」例外がスローされますが、行くとき問題++(「CIN」文)

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

私はexception.Programの2種類を使用していますが完璧に働いています"invalid_argument"例外が発生した場合、無限ループに入ります。実際にはキャッチブロックの "cin>>c"ステートメントに問題がありますが、なぜこれが起こっているのかわかりません。

+0

"invalid_argument"のキャッチブロックから入力シナリオ全体を削除し、 "break"文だけを置くと、プログラムが完璧に動作します。 –

+0

この回答を見る:http://stackoverflow.com/questions/2407771/c-character-to-int/2407991#2407991 – kennytm

+0

ありがとうKenny、私はcinストリームを流すために2つのステートメントを使用します。 "std :: cin.clear(); std :: cin.ignore(80、 '\ n');" "std :: numeric_limits :: max()"エラーが発生しています。 プログラムは現在完全に動作しています –

答えて

3

非数値文字に遭遇std::cin>>a>>b、2つの関連のことが起こる:

  • 問題の文字が消費されません。
  • フェイルビットstd::cinが設定されています。

std::cin以降のすべての読み取りが後から行われないようにします。これには、invalid_argument catchブロック内のものと、ループの後続の反復内のものが含まれます。

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

0

exception masksで遊ぶことができますが、エラーを処理するための好ましい方法があります。