2017-09-21 1 views
-3

Ich arbeite an C++, und mit einer einfachen Authentifizierungsmethode mit if-Anweisungen, also was ich hier habe, ist, wenn die Eingabe nicht die gewünschte Kombination ist, wird Access verweigert und fragen Sie den Benutzer, ob er es erneut versuchen oder beenden möchte. Ich habe versucht, dies mit der Goto-Variable zu tun, aber es hat nicht funktioniert. Hilfe bitte? (Full-Code: https://pastebin.com/49LdGgJX)C++: Goto und Benutzereingabe funktioniert nicht

else { 
    cout << "Access denied..." << " Try again? (Y/N) >" << flush; 
    string ask; 
    cin >> ask; 
    if(ask == "N" || "n"){ 
     cout << "Shutting down..." << endl; 
     goto end; 
    } 
    else if(ask == "Y" || "y"){ 
     goto restart; 
    } 

    else { 
     cout << "Invalid option." << endl; 
     goto restart; 
    } 
    } 

    end: 
    return 0; 
+3

die Verwendung von goto ist eine schlechte Angewohnheit versuchen, es durch eine while-Schleife ersetzen –

+3

Der gezeigte Code in der Frage erfüllt nicht die Anforderungen eines [MCVE], wie in der [Hilfe] erläutert. Alle Fragen auf stackoverflow.com müssen alle relevanten Informationen in der Frage selbst enthalten. Links zu externen Websites, die jederzeit nicht mehr funktionieren können, sind nicht akzeptabel. –

+2

"X ist A oder B" in Englisch ist "X = A oder X = B" wenn in Logik übersetzt. Sie haben "X = A, oder B ist irgendwie wahr". – molbdnilo

Antwort

0

Eine der möglichen Auflösungen dieser Codestruktur in mehr prozedurale Weise (würde nicht wagen, dies "objektorientiert" zu nennen). Sie können ähnliche Methoden verwenden, um den Menüverarbeitungscode in separate Funktionen für jede Option usw. aufzuteilen.

Wenn es sich um eine Mehrbenutzer-App handelt, können Sie anstelle von einfachen echten/falschen Vollanmeldeinformationen speichern Benutzer authentifiziert, wie eine Struktur zu haben, die name, code enthält (Passwort kann wahrscheinlich nach der Authentifizierung weggeworfen werden, um es nicht lange im Speicher zu halten, wenn Sie es später nicht brauchen).

// returns true if user wants to exit 
// sets authenticated to true when the Drew user is detected 
bool AuthenticateUser(bool & authenticated) { 
    cout << "Enter your username >" << flush; 
    ... 
    if (name == "Drew" && ...) { 
    authenticated = true; 
    cout << "Access granted. Welcome, " << name << "." << endl; 
    cout << "Welcome to Database of Drew" << endl; 
    return false; 
    } 
    cout << "Access denied..." << " Try again? (Y/N) >" << flush; 
    ... 
    return (ask == "N" || ask == "n"); // N = wants to exit 
} 

// returns true if user wants to exit 
bool ProceedWithMenu() { 
    cout << "1.\tAdd new record." << endl; 
    cout << "2.\tDelete record." << endl; 
    ... 
    if (1 == value) { 
    ... 
    } 
    if (5 == value) { 
    cout << "Application quitting... " << endl; 
    } 
    return (5 == value); 
} 

void mainLoop { 
    bool authenticated = false; 
    bool exitApp = false; 

    do { 
    if (!authenticated) { 
     exitApp = AuthenticateUser(authenticated); 
    } else { 
     exitApp = ProceedWithMenu(); 
    } 
    // repeat authentication/menu until user decides to quit app 
    } while (!exitApp); 
} 

Dieses Beispiel ist noch recht grob und vereinfachend, gerade Energie von do {} while, return, und ähnlich zu illustrieren versuchen. Oft können auch continue und break eine große Hilfe sein, um den Ablauf der Codeausführung ohne goto und Labels zu steuern.

1

Ihre if Aussagen falsch sind:

if(ask == "N" || "n") 

immer true werten, weil die "n" Operanden ergeben immer true und Sie werden mit einem logischen OR Operator. Das Zeichenfolgenliteral von "n" zerfällt zu const char* Zeiger, dessen Wert nicht 0 ist, also true auswertet. Was Sie wollen, ist:

if(ask == "N" || ask == "n") 

und:

else if(ask == "Y" || ask == "y") 

Das ist nicht goto verwenden Sie gesagt wird.