C++ 程序终止,而不是继续整数输入验证循环

C++ 程序终止,而不是继续整数输入验证循环,c++,validation,integer,C++,Validation,Integer,我要求用户通过输入与物品对应的整数,在背包中的物品之间进行选择。但是,尽管我使用了当前的整数输入验证代码,整个程序仍会终止,而不是重新显示选项并要求用户再次输入选项。下面的代码中是否存在任何可能导致此问题的问题 int num; do{ std::cout << "Choose item to use." << std::endl; for(int i = 0; i < backpack->size()

我要求用户通过输入与物品对应的整数,在背包中的物品之间进行选择。但是,尽管我使用了当前的整数输入验证代码,整个程序仍会终止,而不是重新显示选项并要求用户再次输入选项。下面的代码中是否存在任何可能导致此问题的问题

    int num;     
    do{
        std::cout << "Choose item to use." << std::endl;
        for(int i = 0; i < backpack->size(); i++){
           std::cout << i+1 << ". " << backpack->at(i) << std::endl;                        
        };
        std::cin >> num;
        if(!std::cin.fail()){
            if(num < 0 || num > (backpack->size())){
                std::cout << "Plese enter an integer in range." <<std::endl;
            }else{
                  break;
            };
        }else{
              std::cin.clear();
              std::cin.ignore(80, '\n');
              std::cout << "Invalid input. Please enter an integer." << std::endl;   
        };                      
    }while(std::cin.fail() || (num<0 || num > (backpack->size())));
int-num;
做{
std::cout size()){

std::cout您必须为
num
指定一个初始值。如果不指定,它将包含一个垃圾值,该值可能小于0或大于
backpack->size()-1
,这将使条件为真

int num = 0;

编辑:删除最后一个答案


以下命令清除
cin.fail()
标志:

std::cin.clear();
std::cin.ignore(80,'\n');
因此,当达到循环条件时,
cin.fail()
返回
false
和。因此,继续条件不会通过,循环返回


正如所建议的,您应该根据您的条件将
num
初始化为无效值,如
-1

在查看代码几次之后,我没有立即发现逻辑有问题,尽管我可能是错的。但从我的理解来看,代码的意图是,while语句中的条件I您已经在检查if语句中的相同条件,并在需要时中断循环,因此请尝试使用
while(true)
作为您的while语句,看看它是否解决了您的问题。

我刚刚发现将“std::cin.fail()”更改为“!(std::cin>>num)”在while条件下实现了这一点。你认为这是为什么?顺便说一句,谢谢你的所有输入!

听起来你可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,你可以逐行执行程序,看看它偏离了你的预期。如果你需要,这是一个必不可少的工具继续进行任何编程。进一步阅读:程序是否终止(
std::terminate
)或者只是循环结束了吗?也请不要害怕空白。您的代码很难阅读,因为您似乎不喜欢空格和空白。无需初始化
num
。它由流提取分配。由于循环num的格式不需要初始化,在do while循环中,他将在使用num之前将值转换为num。但是,如果您想检查它是否失败,最好将其初始化为对其条件无效的值,因此…
int num=-1;
check
num
以查看提取是否失败?这将如何工作?您需要检查流(OP的做法或多或少是正确的).@Buster是的,这是正确的。您需要检查流以查看cin是否失败。但是,您是否将变量初始化为有效状态(成功),或者初始化为有效索引?我唯一这样做的时间是循环,否则我总是初始化为失败值,这样,如果代码中存在逻辑错误,则更容易进行故障排除,since它会更快地失败,而不是可能在恶劣的条件下工作。让我们来看看。我认为如果num为负值或大于背包大小,他确实希望继续循环…但如果cin处于失败状态,可能不会。确实,重新阅读代码会有帮助^^^抱歉!如果OP确认,将删除。目前,如果我输入的内容超出术语范围,则对于物品编号,验证工作正常。但是当我尝试输入“a”而不是1到5之间的整数时,程序将完全终止,而不是要求用户再次尝试输入。因此,是的,我希望循环继续,只要输入的物品编号不是介于1和背包大小-1之间。唯一真正正确的是a回答这里。另一个建议是,循环条件不应该检查以前已经检查过的内容,因此
}while(true);
会更好。更好的是检查实际的输入操作:
do{while(!(cin>>num)){/*failure,continue,如果EOF*/}while(!in_range(num));