输入不断要求更多 [已关闭]

Input keeps asking for more [closed]

提问人:Fernando Padilla 提问时间:11/8/2023 更新时间:11/8/2023 访问量:51

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

13天前关闭。

上下文:我正在尝试用 C++ 制作一个小程序,要求用户创建一个帐户,然后登录。创建帐户时,它会要求提供角色、用户名和密码。要选择角色,您必须输入整数 1-3。当它要求我担任这个角色时,问题就出现了。我输入一个数字,单击回车键,但仍然允许我输入另一个数字,而不是转到下一部分。所以我总共必须输入 2 个数字,但程序仍在继续。创建帐户后,我尝试登录。它还要求提供角色、用户名、密码。在登录中,它可以完美地工作,但它不允许我登录。我99%确定一定是因为这个问题。不过,它可以是其他任何东西。我不是专家,我才刚刚开始编程。

#include <iostream>
#include <vector>


using namespace std;

struct User // struct User stores username and password
{
    string username;
    string password;
    string role;
};

vector<User> users; // vector User stores user data

void createAccount() // function to create account
{
    User user;

    cout << "Select your role: " << endl;
    cout << "1. Tier I 2. Tier II 3. Tier III" << endl;

    int roleChoice; // variable for role selection
    cin >> roleChoice; // user selects role by inputing an integer

    switch (roleChoice) // switch enables 3 possible roles
    {
    case 1:
        user.role = "Tier I";
        break;
    case 2:
        user.role = "Tier II";
        break;
    case 3:
        user.role = "Tier III";
        break;
    default:
        cout << "Invalid role selected. Try again." << endl; // invalid input
        return;
    }

    cin >> user.role;
    cout << "Enter a user name: ";
    cin >> user.username;
    cout << "Enter a password: ";
    cin >> user.password;
    users.push_back(user); // push_back user adds a user to the vector User
    cout << "Account created successfully!\n";

}

bool login(string& loggedInUser)
{
    string username, password, role;
    cout << "Select your role:\n";
    cout << "1. Tier I 2. Tier II 3. Tier III" << endl;

    int roleChoice; // variable for role selection
    cin >> roleChoice; // user selects role by inputing an integer

    switch (roleChoice) // switch enables 3 possible roles
    {
    case 1:
        role = "Tier I";
        break;
    case 2:
        role = "Tier II";
        break;
    case 3:
        role = "Tier III";
        break;
    default:
        cout << "Invalid role selected. Try again.\n"; // invalid input
        return false;
    }

    cout << "Enter your username: ";
    cin >> username;
    cout << "Enter your password: ";
    cin >> password;

    for (const User& user : users) // loop searches for information that matches
    { // const in order to avoid any changes

        // verifies that the information inputed is the same
        if (user.role == role && user.username == username && user.password == password)
        {
            loggedInUser = username;
            cout << "Login succesful. Welcome, " << loggedInUser << " (" << role << ")\n ";
            return true; // if information is correct, user logs in
        }
    }

    cout << "Login failed. Invalid role, username, or password.\n";
    return false;
}


int main()
{
    string loggedInUser;
    int choice;
    do // user chooses to create account, login, or exit
    { 
        cout << "1. Create account\n2. Login\n3. Exit\n";
        cin >> choice;

        switch (choice)
        {
        case 1:
            createAccount();
            break;
        case 2:
            if (login(loggedInUser))
            {
                cout << "Welcome, " << loggedInUser << "!\n";

                int loggedInChoice;
                do {
                    std::cout << "1. Perform action 1\n2. Perform action 2\n3. Logout\nEnter your choice: ";
                    std::cin >> loggedInChoice;
                    switch (loggedInChoice)
                    {
                    case 1:
                        // Implement action 1.
                        std::cout << "Action 1 performed.\n";
                        break;
                    case 2:
                        // Implement action 2.
                        std::cout << "Action 2 performed.\n";
                        break;
                    case 3:
                        std::cout << "Logged out. Goodbye!\n";
                        break;
                    default:
                        std::cout << "Invalid choice. Please try again.\n";
                        break;
                    }
                } while (loggedInChoice != 3);
            }
            break;
        case 3:
            cout << "Goodbye!\n";
            break;
        default:
            cout << "Invalid choice. Try again.\n";
            break;
        }

        
    } while (choice != 3);

    return 0;

}
C++ 输入 switch-statement

评论

3赞 kiner_shah 11/8/2023
在创建帐户中,为什么要在上面设置它时采取?cin >> user.role
1赞 molbdnilo 11/8/2023
如果无法登录,请验证 的成员是否为假定的成员。(剧透:他们不是。user
2赞 Quimby 11/8/2023
您是否尝试过使用调试器单步执行代码?

答:

-1赞 Shreeyash Shrestha 11/8/2023 #1

在代码的这一部分中:

void createAccount() // function to create account
{
    User user;

    cout << "Select your role: " << endl;
    cout << "1. Tier I 2. Tier II 3. Tier III" << endl;

    int roleChoice; // variable for role selection
    cin >> roleChoice; // user selects role by inputing an integer

    switch (roleChoice) // switch enables 3 possible roles
    {
    case 1:
        user.role = "Tier I";
        break;
    case 2:
        user.role = "Tier II";
        break;
    case 3:
        user.role = "Tier III";
        break;
    default:
        cout << "Invalid role selected. Try again." << endl; // invalid input
        return;
    }

    cin >> user.role;
    cout << "Enter a user name: ";
    cin >> user.username;
    cout << "Enter a password: ";
    cin >> user.password;
    users.push_back(user); // push_back user adds a user to the vector User
    cout << "Account created successfully!\n";

}

您已经请求了角色选择,然后根据用户的输入进行了分配。

然后你放一个 ,正如你所猜到的,它第二次要求用户提供该选项。 cin >> user.role;

由于(例如)您在第一次尝试时按了 1,因此 的值将是 I 层。user.role

但是,由于您在第二次尝试时再次按 1,因此 的值将为 1。因为您通过第二个输入为其分配了 1。这就是你在程序上得到整个错误的方式。user.role

因此,您需要做的就是删除代码的那部分,即从程序中删除,它将起作用。 cin >> user.role;

告诉我它是否有效!!

评论

0赞 Fernando Padilla 11/9/2023
哇,我觉得自己好傻。你是对的,我没有注意到我在问用户两次。这些小错误让我在编程中发疯。非常感谢,该程序现在可以运行,并且只询问用户一次。