2011-10-30 14 views
5

ユーザーに5桁の数字を入力するように指示する関数を記述しようとしています。ユーザーが文字列または非整数入力を入力しようとすると、不正な入力を処理するための例外ブロックを作成します。不正な入力に対して例外処理を行う方法を教えてください。

私は、分母が0であるという例外をスローした除算関数のようなものに対して例外処理ブロックを書く方法を知っていますが、私は制御できない入力に対してこれを行う方法がありません。

答えて

7

まず、私は一般的にこれに反対しています。ユーザーからの悪い入力は、例外ではなくほぼルールになっています。

あなたはとにかくそれを行う上で主張する場合、あなたはおそらく、入力としてを受け入れることによってそれを行うだろう、それはあなたが望むものはない場合とき/例外を投げる:、

// Warning: untested code.  
// Accepting negative numbers left as an exercise for the reader. 
int get_int(std::istream &is) { 
    std::string temp; 

    std::getline(temp, is); 

    for (int i=0; i<temp.size(); i++) 
     if (!isdigit(temp[i])) 
      throw std::domain_error("Bad input"); 
    return atoi(temp); 
} 

私は繰り返ししかし、私はこれが一般的に良い考えだとは思わない。私は、iostreamsが既にfailビットをこのような状況のために特別に定義していることを(一例として)指摘しています(そして、intを読み取るための通常のoperator>>はそのメカニズムを使用します)。

+0

あなたは 'atoi()'を使いますが、あなたの文字列のすべての文字を非数字でチェックします。なぜ?? – vsz

+0

ありがとうございます。なんらかの理由で、私は自分の入力を整数変数に格納しなければならないという考え方に固執しました。入力を文字列として受け入れて変換すると、私の問題は解決します。 – JeramyRR

+0

@vsz:彼の質問は、特に悪い入力をチェックし、発生したときに例外をスローすることでした。それをして、atoiはintを返す最も簡単で簡単な方法でした。 –

0

最も簡単な解決策は、文字列を読み取って整数に変換することです(たとえば、atoi)。結果としてゼロが得られ、文字列が "0"でない場合は、入力が数値ではなく、文字列をループする必要はありません。

+0

残念ながら、プログラムの入力部分を終了させるために0を使用する必要があるので、入力が本当に0であるかを知る必要があります。 – JeramyRR

+0

入力が実際に0かどうかを個別に確認できます。より詳細な議論は、http://stackoverflow.com/questions/1640720/how-do-i-tell-if-the-c-function-atoi-failed-or-if-it-was-a-ゼロストリング – vsz

0

有効なデータストリーム内で無効なデータが発生すると予想される理由がない、別のマシンまたはプロセスからデータを受け入れる場合、例外がしばしば適切です。ユーザーの入力に関しては、例外は、通常のプログラムの流れからはっきりとはずれる場合にのみ使用してください。たとえば、プログラムがtty形式のインターフェースを持ち、入力行を読み込むルーチンがcontrol-Cを取得した場合、そのようなルーチンが例外をスローすると便利です。 control-Cは必ずしもプログラムを終了させるべきではありませんが、プログラムがユーザーからの複数行の入力を読み込もうとしている場合は、control-Cを入力すると余りがスキップされることがよくあります。

関連する問題