Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在while循环中调用布尔函数_C++_Visual C++ - Fatal编程技术网

C++ 在while循环中调用布尔函数

C++ 在while循环中调用布尔函数,c++,visual-c++,C++,Visual C++,我有一个bool函数,里面有if-else语句。第一个“if”返回“false”,而else返回“true”。我想在另一个函数中调用这个布尔函数,其中有一个while循环。我试了好几次,都成功了。然而,当我调用函数时,它总是返回“true”。我怎样才能解决这个问题 bool secretCheck(string P1_name, string P2_name, char secret){ secret = 'R', 'G', 'B', 'P', 'Y', 'M'; if (se

我有一个bool函数,里面有if-else语句。第一个“if”返回“false”,而else返回“true”。我想在另一个函数中调用这个布尔函数,其中有一个while循环。我试了好几次,都成功了。然而,当我调用函数时,它总是返回“true”。我怎样才能解决这个问题

bool secretCheck(string P1_name, string P2_name, char secret){
    secret =  'R', 'G', 'B', 'P', 'Y', 'M';
    if (secret != 'R' && secret != 'G' && secret != 'B' && secret != 'P' && secret != 'Y' && secret != 'M' && secret > 4){
        return false;   
    }
    else {
        return true;
    }
}

void secretLoop(string P1_name, string P2_name, char secret){
    while(!secretCheck(P1_name, P2_name, secret)){
        cout << "Invalid secret!"<< endl;
        cout << P1_name << ", please enter your secret: ";
        cin >> secret;
    }

    if(secretCheck(P1_name, P2_name, secret)) {
        cout << "Ok\n";
    }
}

在函数secretCheck中,将值“R”指定给secret,完全覆盖它以前的内容。然后,返回错误的iff机密!='R’。因此,您永远不会返回false,因为secret永远是“R”。不清楚在该函数的第一行中您试图做什么,特别是因为该函数的含义不清楚,您甚至从未使用任何一个字符串参数。我建议确保您的功能实际执行了您希望它执行的任务。

我不确定您想用这一行做什么:

secret =  'R', 'G', 'B', 'P', 'Y', 'M';
一个字符只能保存一个值。在本例中,您使用的是逗号运算符,它删除第一个值并返回第二个表达式

在这一行,secret始终等于“R”,因为它等于:

secret = 'R'; // now secret is equal to the character 'R'
然后,在你的if声明中,你得到:

secret != 'R' && /* ... */
这永远是错误的,因为secret总是等于R

然后,有一个令人难以置信的比较:

secret > 4
这也是事实,因为比较字符和int将比较字符的ASCII值

要在变量中存储多个字符,它必须是std::string或std::vector类型:


为什么你有行秘密='R','G','B','P','Y','M';?你觉得它是干什么的?我觉得它储存了秘密可以带走的人物。不是吗?@YassineEzzaim没有。我猜如果你启用了警告,你会看到一些与该行相关的警告。@Aschepper我没有任何警告:/,那行错了吗?如何在该字符中存储字符列表?@YassineEzzaim您不能在字符中存储字符列表。您可以有一个字符列表,也可以有一个字符。一个变量不能同时具有多个类型逗号运算符的优先级低于赋值,因此实际上将secret设置为“R”。同样的问题。我如何将这些字符分配给变量类型的字符或字符串?@YassineEzzaim我很难理解你想问我什么。您想要一个字符列表还是一个字符?我想检查用户输入字母时,Secret是否只包含这些字母。@YassineEzzaim您在这里并不特别需要字符列表。您可以立即使用if secret!='R'&&…&&秘密我觉得像string::find这样的东西是另一种方式。
std::vector<char> secret_characters = {'R', 'G', 'B', 'P', 'Y', 'M'};
void is_secret(std::vector<char> const& secret_characters, char secret) {
    auto found = std::find(
        secret_characters.begin(), secret_characters.end(),
        secret
    );
    return found != secret_characters.end();
}

bool secretCheck(string P1_name, string P2_name, char secret){
    std::vector<char> secret_characters = {'R', 'G', 'B', 'P', 'Y', 'M'};
    if (is_secret(secret_characters, secret)) {
        return false;   
    } else {
        return true;
    }
}