我的程序功能之一中的if语句似乎有问题。
我希望代码行停止直到显示正确的变量,同时还要输出错误消息。但是,无论是否输入了错误或正确的变量,代码都会继续执行,并且错误消息也会随之显示。
这是带有if语句
的代码部分string get_class(){
string char_class;
cout<<"Choose A Character Class!"<<endl;
cout<<"The Cleric, a holy disciple! Select C."<<endl;
cout<<"The Fighter, an unstoppable warrior! Select F."<<endl;
cout<<"The Paladin, a holy warrior! Select P."<<endl;
cout<<"The Rogue, a sneaky thief! Select R."<<endl;
cout<<"The Wizard, a wizened magician! Select W."<<endl;
cin>>classSelection;
if(classSelection != "C"||"c"||"F"||"f"||"P"||"p"||"R"||"r"||"W"||"w")
cout<<"Please Enter Given Selections"<<endl;
return char_class;
}
很抱歉,如果没有提供足够的程序,或者此代码段中的所有内容看起来都很混乱。
答案 0 :(得分:3)
让我们简化示例。您的代码由于以下原因而无法正常工作:
int x = 2;
if(x == 1 || 2) { ... }
这是因为||
运算符没有以这种方式连接。上面的示例评估x == 1
(false
)并将其与||
进行或(2
),如下所示:
if(false || 2) { ... } // after evaluating of x == 1
我们现在有false || 2
。在C++
中,任何非零数值的取值为true
,因此我们以false || true
结尾,即true
。
但是在此示例中,它似乎有效,对吧?
它只会出现。将2
替换为3
,即使true
既不是x
也不是{ {1}}。
如果是小组合,则应该正确提供所有表达式:
1
代替:
3
因此在您的示例中,您将需要:
if(x == 1 || x == 2) { ... }
但是那仍然不会做你想要的。您不想知道if(x == 1 || 2) { ... }
是否等于if(classSelection != "C" || classSelection != "c" || classSelection != "F" || ... )
或不等于classSelection
。您想知道它是否等于"C"
,并且不等于"c"
,所以您实际上想要:
"C"
您的示例将需要输入一些内容。另一种效率稍低但可以说更具可读性的方法是将所有可能的匹配存储在数据结构中,并使用标准算法,例如std::all_of
:
"c"
if(classSelection != "C" && classSelection != "c" && classSelection != "F" && ... )
接受一个范围和一个谓词,如果所有元素都满足该谓词,则返回#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
int main() {
std::vector<const char*> not_accepted= {
"C", "c", "F", "f", "P", "p", "R", "r", "W", "w"
};
std::string choice = "f"; // provided by user
bool valid = std::all_of(not_accepted.cbegin(), not_accepted.cend(),
[&](auto arg){
return choice != arg;
});
std::cout << "valid? - " << std::boolalpha << valid;
}
。在这里,范围是我们的std::all_of
向量,而谓词则表示为lambda,它将把该向量的每个元素与我们的true
字符串进行比较。
为达到最佳效果,可以将not_accepted
替换为choice
或std::vector
并检查集合中是否存在元素。那将摆脱算法调用:
std::set
答案 1 :(得分:3)
我个人的最爱
while("CcFfPpRrWw"s.find(classSelection) == string::npos)
{
cout << "Please Enter Given Selections" << endl;
cin >> classSelection;
}
在您的原始代码中,您犯了菜鸟错误或正在寻找可能的候选人。这些将单独评估为true,导致整个表达式始终评估为true。
我的代码将所有选择都放在一个临时字符串中,并在其中搜索输入的字符。如果找不到,则返回string :: npos,触发while循环。