2011-08-06 7 views
1
bool choose() { 
    int answer = 0; 
    while(answer != 1 || answer != 2) { 
     cout << endl << "Do you want to encrypt(enter 1) or decrypt(enter 2)?" << endl; 
     cin >> answer; 
    } 
    if(answer == 1) return true; 
    return false; 
} 

入力から行を読み込み、入力を整数と比較する最良の方法は何ですか? 私は方法が分かりますcingetsgetline(cin, answer)です。 私はどちらを使うべきですか?なぜですか?コンソールからのC++入力、整数の比較

現時点では、私は1または2を入力すると、まだwhileにとどまっているので、この方法は機能しません。

答えて

3

このコードはdo-whileループのための非常に良い候補である、とあなたは変数answerを初期化するために必要としていないことを使用している場合。

int answer; //= 0; no need to initialize! 
do { 

    cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl; 
    cin >> answer; 

}while(answer != 1 && answer != 2); 

そしてもちろん、あなたが他の人がすでに指摘したように&&を使用する必要があります。 :-)

ところで、ユーザーがhgjkhgなどの非整数入力を入力した場合はどうなりますか? cin>>answerは入力を読み込むことができず、それは永遠にそこに残り、cinのフラグは失敗に設定され、cinはそれ以上の入力を読み取ることができません。つまり、ループは決して終了しません。

これを回避するために、そして、コードをより堅牢にし、あなたのようにそれを書くべきで完了させる:

int answer = 0; 
while(answer != 1 && answer != 2) { 

    cout<<"Do you want to encrypt(enter 1) or decrypt(enter 2)?"<<endl; 
    if (!(cin >> answer)) 
    { 
    cin.clear(); //clear the failure flag if there is an error when reading! 
    std::string garbage; 
    std::getline(cin, garbage); //read the garbage from the stream and throw it away 
    } 
} 

はい。 do-whileの代わりにwhileループを使用できます。あなたのコードにif(!(cin>>answer)) { ... }を追加するだけです。 :-)

+0

答えとして受け入れるかどうかわからないので、人々は私の質問に早く答えてくれました。しかし、あなたはもっと多くのものを指摘しました。これは非常に感謝しています。 – Jaanus

+0

@ジャヌス:もちろん、あなたは私のものを受け入れるべきです:P ..このコードはあなたが書いたものよりも頑強で完全です。 :-) – Nawaz

+0

オハイオ州と私はあなたが言ったことをしました、しかし、入力のために 'test'のような単語を入力すると、それは恐ろしいところで' DO'の実行を開始し、何かを入力する新しい機会を与えません。あなたは暗号化しますか(1を入力してください)........ '無限に:/ PS!私は何かを入力させずに、毎回 'if'サイクルに入ります! – Jaanus

5

値を正しく読み取っていますか。しかし、ループの状態は間違っています。それは||を使用して

while(answer != 1 && answer != 2) 

する必要があります何の数があなたの条件が間違って1と2の両方

10

に等しくないので、条件は常にtrueになります。 De Morgan's lawsすると、代わりに&&を使用する必要があります。

while(answer != 1 && answer != 2) { 
+0

+1説明リンクです。 –

+0

DeMorganの法則によって、他の条件は次のようになります。 '!(answer == 1 || answer == 2)' – Ajay

+0

変数にこれらの値のいずれかがある場合、ループを終了したいからです。 –