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;
checknum
以查看提取是否失败?这将如何工作?您需要检查流(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));