如何为该函数正确使用if语句?

时间:2019-03-08 18:44:32

标签: c++

我的程序功能之一中的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; 

}

很抱歉,如果没有提供足够的程序,或者此代码段中的所有内容看起来都很混乱。

2 个答案:

答案 0 :(得分:3)

让我们简化示例。您的代码由于以下原因而无法正常工作:

int x = 2;
if(x == 1 || 2) { ... }

这是因为||运算符没有以这种方式连接。上面的示例评估x == 1false)并将其与||进行或(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替换为choicestd::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循环。