C++ c++;,根据最新的二维阵列数据检查用户输入

C++ c++;,根据最新的二维阵列数据检查用户输入,c++,c++17,C++,C++17,我正在为我们的最终项目制作一个程序,该程序包含登录/注册 我已经制作了一个struct数据包含一个2D数组,该数组包含100行(该数组可以包含的最大学生数)和2列(一列表示矩阵数,一列表示密码) 在登录函数中,我已经完成了以下操作,但即使我的登录数据是正确的,它也总是转到else条件 void login() { string CheckMatric, CheckPassword; system("CLS"); cout << endl;

我正在为我们的最终项目制作一个程序,该程序包含登录/注册

我已经制作了一个struct数据包含一个2D数组,该数组包含100行(该数组可以包含的最大学生数)和2列(一列表示矩阵数,一列表示密码)

在登录函数中,我已经完成了以下操作,但即使我的登录数据是正确的,它也总是转到else条件

void login() {
    string  CheckMatric, CheckPassword;
    system("CLS");
    cout << endl;
    cout << "Enter Matric number: " << endl;
    cin >> CheckMatric;
    cout << "Enter Password: " << endl;
    cin >> CheckPassword;

    for (int i = 0; i < sizeof(sData.AccessData); i++) {
        for (int j = 0; j < sizeof(sData.AccessData[i]); j++) {
            if (CheckMatric == sData.AccessData[i][j]) 
                if(CheckPassword == sData.AccessData[i][j]) {
                cout << "Successfully logged in" << endl;
                exit(0);
            }
            else {
                int choice;
                cout << "oops, wrong username or password, try again or call +60...... for support" << endl;
                cout << endl;
                cout << "Enter 1 to try again OR Enter 2 to sign up " << endl;
                cout << endl;
                cin >> choice;
                if (choice == 1)
                    login();
                else if (choice == 2)
                    signup();
                else if (choice == 0)
                    exit(0);
                else {
                    cout << "Opps, you will start from the begining :( " << endl;
                    first_interface();

                }       
            }
        }
    }
}
void登录(){
字符串CheckMatric,CheckPassword;
系统(“CLS”);

cout假设CheckMatric和CheckPassword都必须等于sData.AccessData[i][j],这意味着密码必须与用户名相同,这可能不是您想要的。您应该完全摆脱j for循环。并将用户名与行的第一个元素进行比较,将密码与行的第二个元素进行比较

size_t n = sizeof(sData.AccessData)/sizeof(sData.AccessData[0]);
for (int i = 0; i < n; i++) {
        if (CheckMatric == sData.AccessData[i][0] &&
            CheckPassword == sData.AccessData[i][1]) {
            cout << "Successfully logged in" << endl;
            exit(0);
        }
// login failed... prompt user here
size\u t n=sizeof(sData.AccessData)/sizeof(sData.AccessData[0]);
对于(int i=0;i提示:因为您使用的是
sData.AccessData[i][j]
在两种比较中,矩阵编号和密码必须相同。此外,使用
sizeof
是不正确的。
sizeof
返回对象的字节大小,而不是数组中的元素数。提示:使用
std::vector
而不是固定长度的C样式数组。
100
这里是一个assu这意味着你每次都要为最坏的情况分配资源。如果可以避免的话,不要设定最大值。这个答案是针对你的具体问题,实现登录数据库的更好方法是使用,其中检查成功登录的过程将非常简单(AccessData[user]==password){…}没有循环。通常,在尝试自己实现之前,最好先检查问题的现有结构。
void signup() {
    system("CLS");
    string NewMatricNo, NewPassword;
    cout << "Enter Your Matric Number: " << endl;
    cin >> NewMatricNo;
    cout << "Enter Password : " << endl;
    cin >> NewPassword;
    
    for (int i = 0; i < sizeof(sData.AccessData); i++) {
        for (int j = 0; j < sizeof(sData.AccessData); j++) {
            NewMatricNo = sData.AccessData[i][j];
            NewPassword = sData.AccessData[i][j];
        }
    }
     cout << "Successfully signed up! " << endl;

}
size_t n = sizeof(sData.AccessData)/sizeof(sData.AccessData[0]);
for (int i = 0; i < n; i++) {
        if (CheckMatric == sData.AccessData[i][0] &&
            CheckPassword == sData.AccessData[i][1]) {
            cout << "Successfully logged in" << endl;
            exit(0);
        }
// login failed... prompt user here