C++编写登录系统时while循环内无输出且程序无响应问题求助
C++登录系统问题修复说明
核心问题列表
- 头文件缺失:使用
std::find需要引入<algorithm>头文件,部分编译器不会隐式引入,会直接导致运行逻辑异常 - 账号存储逻辑错误:先执行
push_back存入空的账号密码,之后才读取用户输入的注册信息,最终账号列表里只有空字符串,没有用户实际注册的有效账号 - 循环条件逻辑完全反向:
while条件写的是「当输入的用户名不存在于列表时才进入循环」,和预期的「验证账号密码正确后退出循环」逻辑完全相反 - 判断分支逻辑反向:密码校验的
if条件写的是「密码不存在时打印欢迎信息」,完全不符合功能预期 - 语法逻辑错误:
else后多写了分号,还额外加了多余的判断条件,导致else后的逻辑块无论判断结果如何都会执行,进一步打乱流程 - 账号匹配逻辑缺陷:原代码不校验用户名和密码的对应关系,只要用户名在用户名列表、密码在密码列表就算校验通过,存在逻辑漏洞
- 重复读取输入:循环条件、
if判断里重复调用std::cin >> existingUser和std::cin >> existingPass,会导致程序无输出等待用户输入,看起来就是挂起无响应的状态
修复后可运行代码
#include <iostream> #include <list> #include <algorithm> // 引入pair存储配对的账号密码,避免账号密码错位问题 #include <utility> int main() { // 存储配对的用户名和密码 std::list<std::pair<std::string, std::string>> user_db; std::string newUsername; std::string newPassword; // 先读取注册信息再存入数据库 std::cout << "Create a Username: "; std::cin >> newUsername; std::cout << "Create a Password: "; std::cin >> newPassword; user_db.emplace_back(newUsername, newPassword); std::string existingUser; std::string existingPass; while (true) { // 单次循环只读取一次账号密码,避免重复等待输入 std::cout << "Enter your Username: "; std::cin >> existingUser; std::cout << "Enter your Password: "; std::cin >> existingPass; // 校验账号密码是否匹配 auto it = std::find_if(user_db.begin(), user_db.end(), [&](const auto& item) { return item.first == existingUser && item.second == existingPass; }); if (it != user_db.end()) { std::cout << "Welcome " << existingUser << ", Thank you for logging in !!\n"; break; } else { std::cout << "Incorrect username or password, Try Again.\n"; } } return 0; }
内容的提问来源于stack exchange,提问作者p.adams
相关产品推荐
相关产品推荐

