You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无法退出do-while循环?输入-1时循环未终止问题求助

问题原因分析

你遇到的核心问题是:内部的长度校验while循环会直接拦截-1输入,让它根本没机会触发外层do-while的终止判断。

我们拆解下输入-1后的执行流程:

  1. 第一次std::cin >> inputinput设为-1
  2. 进入内部循环while(input < 8 || input > 16)——-1满足<8的条件,直接进入循环体。
  3. 因为输入的是合法整数,!std::cin为假,不会执行缓冲区清理操作。
  4. 循环体提示重新输入密码长度,再次执行std::cin >> input——如果你继续输入-1,又会重复上述流程,永远困在内部循环里,根本到不了外层do-while的终止判断环节。
解决方案

你需要给-1开个“绿色通道”,让它跳过长度校验,直接触发外层循环的终止判断。这里有两种简洁的实现方式:

方式一:修改内部循环的触发条件

-1排除在循环触发条件之外,这样输入-1时会直接跳过内部校验:

while((input < 8 || input > 16) && input != -1) {
    if(!std::cin) { 
        std::cin.clear(); 
        std::cin.ignore(100, '\n'); 
    } 
    std::cout << "Password length must be between 8 and 16.\nEnter password length: "; 
    std::cin >> input; 
}

方式二:读取输入后立即判断终止指令

在进入长度校验前,先检查是否是终止信号-1,逻辑更直观:

std::cin >> input;
// 新增:如果输入是-1,直接跳过长度校验
if(input == -1) {
    break;
}
while(input < 8 || input > 16) {
    // 原循环体代码保持不变
}

额外小修复

还有个隐藏问题:std::cin >> input会在输入缓冲区留下换行符,后续的std::getline(std::cin, company)会直接读取这个空行,导致company为空。你可以在读取input后加上缓冲区清理:

std::cin >> input;
// 清除输入缓冲区的换行符(需要包含<limits>头文件)
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

内容的提问来源于stack exchange,提问作者Anmol Brar

火山引擎 最新活动