2017-09-21 5 views
-3

私はC++で作業していますが、ifステートメントを使用して基本的な認証方法を使用していますので、ここでは入力が望ましい組み合わせでない場合、ユーザーに再試行するか終了するかを尋ねます。私はgoto変数を使ってこれをやろうとしましたが、動作していません。助けてください? (フルコード:https://pastebin.com/49LdGgJX)としてあなたのif文が間違っているC++:gotoとユーザー入力が連携していません

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

gotoの使用は悪い習慣ですwhileループで置き換えようとします –

+3

質問に表示されているコードは、[ヘルプ]で説明されている[mcve]の要件を満たしていません。 stackoverflow.comのすべての質問は、質問自体にすべての関連情報を含める必要があります。いつでも機能しなくなる外部のWebサイトへのリンクは許可されません。 –

+2

"XはAまたはBです"とは英語で "X = AまたはX = B"です。あなたは「X = A、またはBは一種の真実」を持っています。 – molbdnilo

答えて

0

コード構造の可能性のある分割の1つが、より手続き的な方法(これを「オブジェクト指向」と呼ぶことはありません)にします。 同様の方法で、メニュー処理コードを各オプションなどの別々の機能に分割することができます。

これはマルチユーザーアプリケーションの場合、単純なtrue/false完全資格情報ではなく、 name, codeを含む構造を持つようなユーザー認証を受けています(後で必要がない場合は、パスワードを長い間メモリに保持しないように、認証後にパスワードを捨てる可能性があります)。

// 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); 
} 

この例では、ちょうどdo {} whileのパワー、return、および類似を説明しようとすると、まだかなり原油と単純化しすぎです。多くの場合continuebreakは、gotoとラベルなしで、コード実行の流れを制御するのに非常に役立ちます。

1

"n"オペランドは常にtrueに評価し、論理OR演算子を使用しているため

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

は常にtrueに評価されます。 "n"の文字列リテラルはポインタに減衰し、その値は0ではなく、trueと評価されます。何が欲しいのです:

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

と:

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

gotoを使用していない言われていること。

関連する問題