Char验证器不仅接受大小写M / F.

时间:2012-11-28 22:08:33

标签: c++ validation char

嘿我试图验证一个字符来限制它为男性或女性接受m或f。但即使按下m或f并且不断循环问题,它也不会通过while条件。

任何人都可以帮助我。 提前致谢。 这是我的代码:

char Validator :: getChar(string q)
{
    char input;
    do
    {
        cout << q.c_str() << endl;
        cin >> input;
    }
    while(!isalpha(input) && "M"||"F"||"m"||"f");
    return input;
}

3 个答案:

答案 0 :(得分:2)

代码的"M"||"F"||"m"||"f"部分没有按照您的想法执行。它的作用是检查那些字符串常量的 ADDRESSES 。由于它们都是非NULL,因此该表达式只返回true,因此您的条件基本上变为:while(!isalpha(input) && true)while(!isalpha(input))相同。

请改为尝试:

char Validator::getChar(const string &q)
{
    char input = 0;

    do
    {
        cout << q << endl;
        cin >> input;
    }
    while((input != 'M') && (input != 'F') && (input != 'm') && (input != 'f'));

    return input;
}

答案 1 :(得分:1)

while中的表达并不代表您的想法。首先,!不适用于整个表达式,其次,“相等”不是隐式测试。你需要写出你的意思。

要测试相等性,请使用==!=运算符。您必须在要测试的每个值上使用运算符;运营商不像普通英语那样“分配”一系列值。写下这样的条件:

while (input != 'M' && input != 'F' && input != 'm' && input != 'f');

您可以看到isalpha来电不是必需的;如果input不等于任何列出的值,那么它是否是按字母顺序排列的字符并不重要。

另一种写作方式是:

while (!(input == 'M' || input == 'F' || input == 'm' || input == 'f'));

请注意,我在内部术语周围有另一组括号,以便!运算符适用于整个表达式,而不仅仅是第一个术语。

答案 2 :(得分:1)

仅针对终止条件的替代方法:

char Validator::getChar(const string &q)
{
    const std::set<char> valid_chars { 'M', 'm', 'F', 'f' };
    char input = 0;

    do
    {
        cout << q << endl;
        cin >> input;
    }
    while (!valid_chars.count(q));

    return input;
}