0

プログラムを実行すると、ユーザーはログインできますが、間違ったユーザー名を入力すると、有効なユーザー名を入力しなかったと言って、ユーザー名のチェック ループが再度実行されます。これは、1つのことを除いて完全に正常に機能します。ログインを 3 回試行し、3 回目の試行が正しく、パスワードの入力を求めるプロンプトが表示されたとします。彼らがそれを入力すると、2番目のパスワードを要求し、次に3番目のパスワードを要求します. 他の試行の機能を完了しているようです。これを確認する方法が思い浮かびません。何か案は。

それを見ると、私がUserCheckの中で呼び出していることがわかりますgetNameIndex。これがエラーが発生している場所であるとほぼ確信しています。

ユーザーをチェックする関数:

void User_Psw::UserCheck()
{
    // read from the database
    ifstream fin("dataBase.txt", ios::in);

    if( !fin.good() )
    {
        cout << "Failed to open database file." << endl;
        return;
    }

    while (fin >> username >> password)
    {
        Usernames.push_back(username);
        Password.push_back(password);
        ++sizeOfDatabase; // This may or may not be needed elsewhere.
    }

    // rest of the program
    cout << "Username: ";
    cin >> username;

    getNameIndex();

    cout << "Password: ";
    cin >> password;

    if(!PasswordMatches())
    {
        cout << "Access denied";
    }
    else
    {
        cout << "Success! You have logged in.";
    }
}

これがユーザー名チェック機能です

void User_Psw::getNameIndex()
{
    userThere = false;

    for(int i=0; i < sizeOfDatabase; i++)
    {
        if (Usernames[i] == username)
        {
            index = i;
            userThere = true;
        }
    }
    if (userThere == false)
    {
        cout << "\nThat user name does not exsist. \n";
        cout << "Please try again. \n\n";
        UserCheck();
    }
}
4

1 に答える 1

1

プログラムの構造が間違っています。

getNameIndexがUserCheck()を再度呼び出す代わりに、getNameIndexがブール値を返すようにする必要があります。成功した場合はtrue、失敗した場合はfalseです。ループ内で実行します。次のようになります。

bool success = false;

while (!success)
{
 cout << "Username: ";
 cin >> username;

 success = getNameIndex();
}

また、グローバル変数を使用する代わりに、それらを関数に渡す必要があります。何かのようなもの:

success = getNameIndex(username);

またgetNameIndex()、I/Oを実行しないでください。呼び出し元の関数getNameIndex()もエラーメッセージの出力を担当する必要があります。getNameIndex()プログラムが別のプログラムによって実行されているときや自動化された方法など、別のコンテキストで使用した場合、コンソールに出力しても意味がありません。

于 2013-02-10T04:58:54.780 に答える