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
相关产品推荐
相关产品推荐

