2016-11-19 8 views
-3

私はシンプルなゲームで作業しています(これはコード全体ではなく、私が問題を抱えているビットでもありません)。条件がfurfilledされた後、それは開始に戻り、それは私が何を入力しても、文字列を再入力することを提供し、私はちょうど'無効な'を取得します。なぜ誰が知っていますか?私はGNU C++コンパイラを使用しています。gotoの後に条件がチェックされない場合

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string command; 
mainscreen: 
    cout << "blab"; 
getlinething: 
    cin.ignore(); 
    getline(cin, command); 
    if (command == "task") 
    { 
     goto mainscreen; 
    } 
    else 
    { 
     cout << "Not valid."; 
     goto getlinething; 
    } 
    return 0; 
} 
+1

「goto」は使用しないでください。他の誰かや悪い習慣を読むのはとても紛らわしいものです。あなたはあなたがやろうとしていることをするために 'while'ループを使うべきです。 – TheValyreanGroup

+0

これは完全なもののサブプログラムであるということですが、私はgotoのアイデアを熟考していましたが、gotoを使わずにサブプログラムをどのように接続すればよいか分かりません。 –

+0

@Whealty_ std :: wstringとwcoutとwcinを使用します。 –

答えて

1

私は、デバッグプリントを使用してコードを実行すると、それはあなたが新しいコマンドを読むたびに、あなたが文字列の最初の文字を失うしていることを示しています。実際、cin.ignore()を削除するとうまく動作します。私はそれをテストし、

cout << "'" << command << "' Not valid" << endl ; 
+0

どのコンパイラを使用していますか? –

+0

Ubuntuでg ++を使用しています。 –

0

:それはあなたのニーズに合った場合にも は、見にしばらくこのを見ています。 cin.ignore()がなければ、文字列にデータを入力することはできません。 初めて入力するとすべてがキャプチャされます。だから私が仕事を書いたら、文字列は「仕事」と言うでしょうが、2回目に入ったら「尋ねる」と言います。なぜそれがそれをやっているのか分かりません。

0

よしをしない理由を、少なくとも目的をデバッグするための

cout << "blab"; 
while(1){ 
    getline(cin, command); 
    if(command == "task"){ 
     cout << "blab"; 
     getline(cin, command); 
    } 
    else{ 
     cout << "Not valid."; 
    } 

} 
0

cin.ignore()の行は、EOFに遭遇しない限り、デフォルトでは1つの文字を常に破棄します(これはcinでかなり慎重に行われます)。

だから、ユーザがtaskと入力してEnterキーを押すとします。 cin.ignore()'t'を破棄し、command文字列には"ask"が含まれます。最初に試合を行う場合は、ttaskと入力する必要があります。いずれの場合も、改行は破棄されます。試合に出合うまで同じことが起こります。

+0

私は本当に確信していません。なぜなら、最初に私が入力した「タスク」に入り、文字列には「タスク」と表示されるからです。 –

関連する問題