2016-03-21 5 views
0

私は毎回「はい」と答えた場合、何度も何度も実行されるプログラムを作ろうとしています。残念ながら、それは私がそれにはいまたはいいえを入力したときに認識していないように見えます、そしていつもデフォルトの "来てください?"メッセージ。コンソールではい/いいえを取得すると常に失敗する

bool getYN(){ 
    bool confirmed = 0; 
    bool answer = 0; 
    string input; 
    while(!confirmed){ 
     getline(cin, input, '\n'); 
     transform(input.begin(), input.end(), input.begin(), toupper); 

     if(input.c_str() == "Y" || input.c_str() == "YES"){ //If the user says yes 
      confirmed = 1; 
      answer = 1; 
     } else if(input.c_str() == "N" || input.c_str() == "NO"){ //If the user says no 
      confirmed = 1; 
      answer = 0; 
     } else { //If the user says something else entirely 
      printf("\nCome again? (Y/N) "); 
     }; 
    }; 
    return answer; 
}; 

私は<string><algorithm>が含まれている:これは、私は、コンソールからの入力を取得するために使用しているコードです。何らかの理由で、入力時にy/yesやn/noが得られないように常に動作します。

+0

'toupper'は0..255の範囲の値を期待しているので' transform(input.begin()、input.end()、input.begin()、toupper) 'はポータブルではありません。 'はしばしば' signed'型なので、未定義の振る舞いを簡単に引き起こすことができます。 – Simple

+0

私はそれを念頭に置いておきます。ありがとうございました。 –

+0

@ Xiremaをコード化する方法を学ぶために、そしてそれが悪い習慣である理由を理解し、他の名前空間を使うことを開始するまで、それはそうではありません。人々はすべてのことをすべて知っているわけではないことを忘れる傾向があります。 – Afflicted

答えて

4
if(input.c_str() == "Y" || input.c_str() == "YES"){ //If the user says yes 
    confirmed = 1; 
    answer = 1; 
} else if(input.c_str() == "N" || input.c_str() == "NO"){ //If the user says no 
    confirmed = 1; 
    answer = 0; 
} 

このようなc-string比較を行うべきではありません。 charのアドレスを取得し、テキスト割り当てオブジェクトのアドレスと比較しています。もちろん、比較はfalseを返すだろう。 C++文字列で

、シンプルoperator==比較が有効です。

if(input == "Y" || input == "YES"){ //If the user says yes 
    confirmed = 1; 
    answer = 1; 
} else if(input == "N" || input == "NO"){ //If the user says no 
    confirmed = 1; 
    answer = 0; 
} 
+0

ああ、私はあなたが別のstd :: string以外の何かをやっているときはいつでも、あなたからC-ストリングを取得しなければならないと思った。ありがとうございました! –

+0

@KelvinShadewing一般的に言えば、cライブラリやcと似たインタフェースとの互換性が必要な場合は、オブジェクトのc-stringバージョンにのみアクセスする必要があります。シェーダをロードするためにOpenGLのようなものに数回使用しました。しかし、これらの(一般的にかなり特殊な)シナリオの外では、生のC文字列を使用しないでください。 – Xirema

+0

入手しました。私はそれを覚えています。 –

0
#include <iostream> 
#include <string> 
using namespace std; // For speed 

int main() 
{ 
    bool saidYes = false; 
    string input; 
    while (!saidYes) 
    { 
     cout << "Input yes or no: "; 
     getline(cin, input); 

     if (input == "no" || input == "n" || input == "NO") 
     { 
      saidYes = true; // breaks the loop 
     } 

     if (input == "y" || input == "Y" || input == "yes" || input == "YES") 
     { 
      saidYes = false; 
     } 
    } 

return 0; 
} 

あなたが不要なコードの巨大な部分を排除するために、上記の例を使用することができ、私は他の文を追加しないことを選択したが、それは意志あなたがここにそれを追加しても動作します。

また、このコードをさらに圧縮することもできますが、これは、これをよりうまく利用するための簡単な例です。

上記のように、==を使用して文字列を比較することができます。他の特定の言語から来ている場合は、慣れ親しんで笑うことができます。

私は文字列とアルゴリズムを含んでいます。何らかの理由で、入力時にy/yesやn/noが得られないように常に動作します。

アルゴリズムは、あなたがしようとしていることに必要ではなく、文字列入力の読み取りと受け入れを必要以上に困難にします。

上記を参照すると、string input;が表示されます。これは、ユーザー入力文字列を格納するために使用できる変数です。

また、getline(cin, input);が表示されます。これは、ユーザーが入力を求められたときに入力する文字列を「読む」ために使用できます。

@Kelvin Shadewing私の最初の答えはあなたの質問でのみ指示されました。この次の例は、私の下のあなたのコメントに向けられています!

あなたはかなりのオプションを持っていますが、ユーザがはいまたはいいえを入力し、入力に応じて特定の結果を生成したいと思っていることを前提に、はいまたはいいえのいずれかを入力すると、元の回答を変更する必要があります。

#include <iostream> 
#include <string> 
using namespace std; // For speed 
int main() 
{ 
    bool saidYes = false; 
    string input; 
    while (!saidYes) 
    { 
     cout << "Input yes or no: "; 
     getline(cin, input); 

     if (input == "no" || input == "n" || input == "NO") 
     { 
      saidYes = true; 
      cout << "you said no" << endl; 
     /* breaks the loop by changing the 
      bool (true or false flag) to true, if you want to produce a specific result, 
      whether it's a simple output statement or a function call you can put it here 

     */ 
     } 

     else if (input == "y" || input == "Y" || input == "yes" || input == "YES") 
     { 
      saidYes = true; 
      cout << "You said yes" << endl; 
     /* breaks the loop by changing the 
      bool (true or false flag) to true, if you want to produce a specific result, 
      whether it's a simple output statement or a function call you can put it here 

     */ 
     } 

     else saidYes = false; 
    } 

    return 0; 
} 
+0

しかし、これははいになるまで常にループします。私が書いたように、プレイヤーに家に入ろうとしているかどうかを尋ねるスクリプトを持っているかどうかなど、単に例のように、私は単にイエスかノーを得る必要がある他のインスタンスで使うことができます。私は、確認機能自体ではなく、プログラムをループする必要があります。 –

+0

ユーザーがはいといいえの両方を入力したときにループを終了する方法を示すコードを更新しました。まだそれが2つのうちの1つであることを確認しながら。 – Afflicted

0

私は、現在の最良の答えに基づいて自分のコードを修正しましたが、confirmedはもはや必要であるように、私もそれを最適化していないました。

bool getYN(){ 
    bool answer = 0; 
    string input; 
    while(!answer){ 
     getline(cin, input, '\n'); 
     transform(input.begin(), input.end(), input.begin(), toupper); 

     if(input == "Y" || input == "YES"){ 
      answer = 2; 
     } else if(input == "N" || input == "NO"){ 
      answer = 1; 
     } else { 
      printf("\nCome again? (Y/N) "); 
     }; 
    }; 
    return answer - 1; 
}; 

小規模な最適化ですが、すべての小さなビットがカウントされます。

関連する問題