2016-11-19 2 views
-3

Ich arbeite an einem simplish Spiel (das ist nicht der ganze Code, nur das Bit, mit dem ich Probleme habe) und ich bin in dieses Problem geraten; Nachdem die Bedingung erfüllt ist, geht es zurück zum Anfang und es bietet mir an, die Zeichenfolge erneut einzugeben, jedoch, was auch immer ich betrete, bekomme ich nur 'nicht gültig'. Weiß jemand warum? Ich verwende den GNU C++ Compiler.C++ wenn Bedingung nicht nach 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

Bitte benutzen Sie nicht 'goto'. Es ist sehr verwirrend, für irgendjemand anderes und schlechte Praxis zu lesen. Sie sollten eine while-Schleife verwenden, um das zu tun, was Sie tun möchten. – TheValyreanGroup

+0

Die Sache ist, dass dies nur ein Unterprogramm in der ganzen Sache ist, ich habe über die Idee mit goto nachgedacht, aber ich kann nicht wirklich herausfinden, wie man die Unterprogramme verbindet, ohne goto zu benutzen, selbst wenn ich es benutzt habe. –

+0

@Whealty_ Verwenden Sie std :: wstring und wcout und wcin. –

Antwort

1

Wenn ich Ihren Code mit einem Debug-Druck ausführen zeigt es, dass jedes Mal, wenn Sie einen neuen Befehl lesen Sie das erste Zeichen der Zeichenfolge zu verlieren. In der Tat, wenn ich dein cin.ignore() entferne, funktioniert es gut. Außerdem haben einen Blick auf diese während zu sehen, ob es Ihren Bedürfnissen entspricht:

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

} 
+0

Welchen Compiler benutzen Sie? –

+0

Verwenden von g ++ in Ubuntu. –

0

Für mindestens Debuggen Zweck, warum

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

Ordnung nicht, ich getestet es aus. Ohne cin.ignore() kann ich die Daten überhaupt nicht in die Zeichenfolge eingeben. Das erste Mal, wenn ich es betrete, fängt alles ein. Wenn ich also eine Aufgabe schreiben würde, würde die Zeichenfolge 'Aufgabe' sagen, aber beim zweiten Mal würde ich 'fragen' sagen. Ich weiß nicht wirklich, warum das so ist.

0

Die Zeile cin.ignore() wird standardmäßig immer ein Zeichen verwerfen (es sei denn, sie trifft auf EOF, was eine ziemlich absichtliche Handlung auf cin wäre).

Nehmen wir also an, der Benutzer gibt task ein und drückt dann die Eingabetaste. Die cin.ignore() löscht die 't' und die command Zeichenfolge enthält "ask". Wenn Sie eine Übereinstimmung erhalten möchten, muss der Benutzer beim ersten Mal ttask eingeben. Die Zeilenschaltung wird in beiden Fällen verworfen. Das gleiche passiert, bis eine Übereinstimmung gefunden wird.

+0

Ich bin nicht wirklich sicher, weil das erste Mal, wenn ich 'Task' eingeben, es durchläuft, und die Zeichenfolge sagt 'Task' –