我要求用户通过输入与该项目对应的整数来选择背包中的项目之间的选择。但是,尽管我当前的整数输入验证代码,整个程序终止而不是重新显示选择并要求用户再次输入选择。下面的代码中是否存在可能导致此问题的问题?
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())));
答案 0 :(得分:2)
您必须为num
分配初始值。如果不这样做,它将包含一个垃圾值,该值可能小于0或大于backpack->size()-1
,这将使条件成立。
int num = 0;
答案 1 :(得分:1)
修改:已删除最后一个答案
以下清除cin.fail()
标志:
std::cin.clear();
std::cin.ignore(80,'\n');
因此,在达到循环条件时,cin.fail()
会返回false
和the unitialized num
most likely contains 0。因此,你的连续条件没有通过,循环返回。
根据@Eddge的建议,您应该将num
初始化为与您的情况无关的值,例如-1
。
答案 2 :(得分:1)
在查看代码几次后,我没有立即看到逻辑问题,尽管我可能错了。但根据我的理解是代码的意图,while语句中的条件是多余的和不必要的。您已经在if语句中检查了相同的条件,并在需要时突破了循环,因此请尝试使用while(true)
作为您的while语句,看看它是否解决了您的问题。
答案 3 :(得分:0)
我刚发现改变&#34; std :: cin.fail()&#34; to&#34;!(std :: cin&gt;&gt; num)&#34;在条件下做了伎俩。你为什么这么认为?顺便说一下,感谢您的所有投入!