operator!="似乎"不与char合作

时间:2017-02-23 13:04:46

标签: c++

我遇到了问题,这是代码:

    #include <iostream>

    using namespace std;

    int main(){

    struct signUP{
        /........./
        char userGENDER;
    }signUP1;

    cout << "Gender [m]= MALE / [f]= FEMALE: ";
    while (signUP1.userGENDER != 'm' || signUP1.userGENDER != 'f'){
        cin >> signUP1.userGENDER;
        if (signUP1.userGENDER != 'm'){
            cout << "ERROR: Failed requirements.\nTry again.\n";
        } else if (signUP1.userGENDER != 'f'){
            cout << "ERROR: Failed requirements.\nTry again.\n";
        }
    }
}

用户必须编辑注册表单,他必须通过按&#34; m&#34;来指定他的性别。对于男性,&#34; f&#34;对于女性。 如果他按下的东西不同于&#34; m&#34;或&#34; f&#34;弹出错误,他可以重试。

构建&gt;编译所有罚款,首先是&#34;性别[m] = MALE / .....:&#34; 。 我可以按下所有内容,但他并不知道我是否按&#34; f&#34; &#34; m&#34; ,&# 39;就像&#34;&#34; 可能是运营商!= 时出错。 我试过==,或者!=&amp;&amp; !=,或==&amp;&amp; ==,或== || ==。

EDIT1:我也试图移动&#34; cin&lt;&lt; signUP.userGENDER;&#34; 不合时宜,或者把它放在不同的地方。

我对c ++缺乏经验,这就是我需要你帮助的原因。

5 个答案:

答案 0 :(得分:3)

char userGENDER = 'x'; //some initial value, would work without initialization

cout << "Gender [m]= MALE / [f]= FEMALE: ";
cin >> userGENDER;
while (userGENDER != 'm' && userGENDER != 'f') {
    cout << "ERROR: Failed requirements.\nTry again.\n";
    cin >> userGENDER;
}

您的代码过于复杂,您似乎无法理解布尔评估的完成方式。

我们可以查看您的代码案例,即“性别!= m ||性别!= f”。 假设性别= m然后“性别!= m ||性别!= f”变为“m!= m || m!= f”,这是“假或真”,这是真的。因此,尽管输入正确,但是开始不正确的情况。避免这种情况的另一种可能性是更可控制的否定:

while (not (userGENDER == 'm' || userGENDER == 'f')) {

这更像是一个人认为:虽然性别不是男性或女性,但仍在迭代。

或者,如果你真的需要它:

bool valid_gender(const char inp){
    return inp == 'm' or inp == 'f';
}

while (not valid_gender(userGENDER)) {

顺便说一句,userGENDER是一个不常见的命名。通常,使用下划线或camelcase,如user_gender或userGender。

答案 1 :(得分:2)

如果输入无效,您希望错误消息和循环,否则您想要中断:

while (true)
{
    cin >> signUP1.userGENDER;
    if (signUP1.userGENDER == 'm' || signUP1.userGENDER == 'f')
        break;
    else
        cout << "ERROR: Failed requirements.\nTry again.\n";
}

答案 2 :(得分:1)

while语句中的逻辑错误:

while (signUP1.userGENDER != 'm' || signUP1.userGENDER != 'f') ...

如果signUP1.userGENDER'm',则它不能等于'f',因此第二部分为真。如果signUP1.userGENDER'f',则它不等于'm',因此第一部分为真。

因此while()子句始终为真。从您的代码片段中判断很难,但您可能希望在&&子句中使用||而不是while

答案 3 :(得分:0)

你在while条件下有两个问题,其中一个条件总是如此,因为char不能同时为m和f if条件相同

#include <iostream>
using namespace std;
int main(){
    struct signUP{ 
        char userGENDER;
    }signUP1;
    cout << "Gender [m]= MALE / [f]= FEMALE: ";
    while ((signUP1.userGENDER != 'm') && (signUP1.userGENDER != 'f')){
       cin >> signUP1.userGENDER;
       if ((signUP1.userGENDER != 'm') && (signUP1.userGENDER != 'f')){
          cout << "ERROR: Failed requirements.\nTry again.\n";
       }
    }
}

答案 4 :(得分:0)

我会做这样的事情

#include <string>
#include <iostream>

using std::string;
using std::cin;
using std::cout;
using std::endl;

enum Gender
{
    UNDEFINED,
    MALE,
    FEMALE
    // missing:
    // - Agender
    // - Androgyne
    // - Androgynous
    // - Bigender
    // - Cis
    // - Cisgender
    // - Cis Female
    // - Cis Male
    // - Cis Man
    // - Cis Woman
    // - Cisgender Female
    // - Cisgender Male
    // - Cisgender Man
    // - Cisgender Woman
    // - Female to Male
    // - FTM
    // - Gender Fluid
    // - Gender Nonconforming
    // - Gender Questioning
    // - Gender Variant
    // - Genderqueer
    // - Intersex
    // - Male to Female
    // - MTF
    // - Neither
    // - Neutrois
    // - Non - binary
    // - Other
    // - Pangender
    // - Trans
    // - Trans*
    // - Trans Female
    // - Trans* Female
    // - Trans Male
    // - Trans* Male
    // - Trans Man
    // - Trans* Man
    // - Trans Person
    // - Trans* Person
    // - Trans Woman
    // - Trans* Woman
    // - Transfeminine
    // - Transgender
    // - Transgender Female
    // - Transgender Male
    // - Transgender Man
    // - Transgender Person
    // - Transgender Woman
    // - Transmasculine
    // - Transsexual
    // - Transsexual Female
    // - Transsexual Male
    // - Transsexual Man
    // - Transsexual Person
    // - Transsexual Woman
    // - Two - Spirit
};

struct signUP
{
    Gender userGENDER = UNDEFINED;
};

int main() {
    signUP signUP1;
    char input;

    cout << "Gender [m]= MALE / [f]= FEMALE: ";
    do
    {
        cin >> input;
        switch (input)
        {
        case 'm':
            signUP1.userGENDER = MALE;
            cout << "male" << endl;
            break;
        case 'f':
            signUP1.userGENDER = FEMALE;
            cout << "female" << endl;
            break;
        default:
            cout << "ERROR: Failed requirements.\nTry again.\n";
            break;
        }
    } while (input != 'm' && input != 'f');
    return 0;
}