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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:36:04