0

我的代码是我正在尝试建立的商店,它可以工作(注册系统工作),直到我输入我的用户和密码(登录系统),输入我的用户名后,程序要求我重新登录并继续这样做(很确定这是因为它是一个真正的循环)。(这是一个项目,因此有不同的不同文件,其中包含构造函数和类。)

这是我的代码的一部分:

while(true)
{
    cout << "Would you like to register or login?" << endl;
    string answer = "";
    cin >> answer;

    if(answer == "register" || answer == "Register")
    {
        cout << "What would be your designated username?: " << endl;
        string newUser;
        cin >> newUser;
        for(int i = 0; i < 20; i++)
        {
            if(customers[i] -> username != newUser)
            {
                cout << "what would be your designated password?: " << endl;
                string newPass;
                cin >> newPass;
                customers[lastRegisteredID] = new Customer(newUser, newPass);
                lastRegisteredID++;
                break;
            }
        }

        //^Register Part.
    }

    if(answer == "login" || answer == "Login")
    {
        cout << "Your username: " << endl;
        string UserAttempt;
        cin >> UserAttempt;
        for(int j = 0; j < 20; j++)
        {
            if(customers[j] -> username == UserAttempt)
            {
                cout << "Username Found!" << endl;
                tempCustomer = customers[j];

                cout << "Your password: " << endl;
                string PassAtempt;
                cin >> PassAtempt;

                if(tempCustomer -> password == PassAtempt)
                {
                    cout << "Password correct \n Successfully logged in." << endl;
                    loggedin = true;
                    break;
                }
            }
        }
    }

    //^Login part.
}
4

2 回答 2

0

while执行成功login操作后,您并没有跳出循环。

此外,如果注册的客户少于 20 个,您的代码会崩溃。

此外,您的代码允许多个用户使用相同的用户名甚至相同的密码进行注册。

尝试更多类似的东西:

Customer* customers[20];
int numCustomers = 0;
bool loggedin = false;

Customer* findCustomer(const std::string &user)
{
    for(int i = 0; i < numCustomers; ++i)
    {
        if (customers[i]->username == user)
            return customers[i];
    }
    return NULL;
}

...

while (true)
{
    std::cout << "Would you like to register or login?" << std::endl;
    std::string answer;
    std::cin >> answer;

    std::transform(answer.begin(), answer.end(), ::tolower);

    if (answer == "register")
    {
        std::cout << "What would be your designated username?: " << std::endl;
        string newUser;
        std::cin >> newUser;

        Customer *cust = findCustomer(newUser);
        if (cust)
        {
            std::cout << "That username is already taken!" << endl;
            continue;
        }

        if (numCustomers >= 20)
        {
            std::cout << "Too many users are registered!" << endl;
            continue;
        }

        std::cout << "what would be your designated password?: " << std::endl;
        std::string newPass;
        std::cin >> newPass;

        customers[numCustomers] = new Customer(newUser, newPass);
        ++numCustomers;

        continue;
    }

    if (answer == "login")
    {
        std::cout << "Your username: " << std::endl;
        std::string UserAttempt;
        std::cin >> UserAttempt;

        std::cout << "Your password: " << std::endl;
        std::string PassAttempt;
        std::cin >> PassAttempt;

        Customer *cust = findCustomer(UserAttempt);
        if ((cust) && (cust->password == PassAttempt))
        {
            std::cout << "Successfully logged in" << std::endl;
            loggedin = true;
            break;
        }

        std::cout << "Not logged in!" << std::endl;
        continue;
    }

    std::cout << "Unknown command! Try again" << std::endl;
}
于 2018-02-05T23:47:43.047 回答
0

您要问的问题(正如您对问题的评论已经说过的那样)来自这样一个事实,即您break;唯一可以摆脱 for 循环(最内层循环),而不是 while 循环。解决此问题的最简单方法是将您的替换while(true)while(!loggedin). 另请注意,您发布的代码中还有一些其他问题。由于我不知道这些错误是否也在您的最终代码中,所以我将仅列出它们(我发现的少数几个):

  • 你的regestration系统内存泄漏:你没有删除你的老客户
  • 您的用户在数组中注册/保存的方式可能与您的意图不同。尝试用不同的用户名注册两个用户,然后用相同的用户名注册更多的用户,然后检查会发生什么;)
于 2018-02-05T23:35:31.973 回答