You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++登录注册功能开发:用户输入与二维数组匹配异常问题咨询

C++登录注册功能问题修复方案

核心问题定位

登录功能问题

  • 循环边界错误:sizeof(sData.AccessData)获取的是数组总字节数而非元素个数,会导致数组越界访问
  • 匹配逻辑错误:要求学号和密码同时等于同一个数组元素,逻辑上不可能成立,永远无法匹配成功
  • 错误触发时机错误:未遍历完全部用户就直接判定登录失败,单条数据匹配失败就直接弹出错误提示

注册功能问题

  • 循环边界错误:同登录功能的sizeof误用问题,存在越界风险
  • 赋值逻辑完全颠倒:将数组原有值赋值给用户输入的临时变量,新用户信息没有写入数组,注册操作实际未生效
  • 无重复校验、容量校验:没有判断学号是否已注册,也没有判断存储容量是否已满,存在数据覆盖和越界风险

优化实现方案

首先优化存储结构体,新增已注册用户计数变量,避免无意义的全量遍历:

struct StudentsData {
    // 每行对应1个用户,第0列存学号,第1列存密码
    string AccessData[100][2] = {
        {"1912765", "1234567"},
    };
    // 记录当前已注册的用户总数,初始预置1个用户
    int userCount = 1;
};
StudentsData sData;

修正后的登录功能代码

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

    bool isLoginSuccess = false;
    // 仅遍历已注册的有效用户
    for (int i = 0; i < sData.userCount; i++) {
        // 直接匹配当前用户的学号和密码,无需内层循环
        if (CheckMatric == sData.AccessData[i][0] && CheckPassword == sData.AccessData[i][1]) {
            isLoginSuccess = true;
            break;
        }
    }

    if (isLoginSuccess) {
        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 signup() {
    system("CLS");
    string NewMatricNo, NewPassword;
    cout << "Enter Your Matric Number: " << endl;
    cin >> NewMatricNo;
    cout << "Enter Password : " << endl;
    cin >> NewPassword;

    // 校验学号是否已注册
    bool isMatricExist = false;
    for (int i = 0; i < sData.userCount; i++) {
        if (NewMatricNo == sData.AccessData[i][0]) {
            isMatricExist = true;
            break;
        }
    }
    if (isMatricExist) {
        cout << "This matric number has been registered, please go to login" << endl;
        system("pause");
        login();
        return;
    }

    // 校验存储容量是否已满
    if (sData.userCount >= 100) {
        cout << "Registration failed: user capacity is full" << endl;
        system("pause");
        first_interface();
        return;
    }

    // 写入新用户数据到数组空位
    sData.AccessData[sData.userCount][0] = NewMatricNo;
    sData.AccessData[sData.userCount][1] = NewPassword;
    sData.userCount++;

    cout << "Successfully signed up! " << endl;
    system("pause");
    login();
}

内容的提问来源于stack exchange,提问作者ABDULRAHMAN ALJAADI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 07:45:03