c++ - 输入验证不起作用

标签 c++ validation

我正在尝试解析来自文件的输入以表示一副标准纸牌(即 2C 表示两张梅花)。但是,我的解决方案没有按预期工作,并声明所有输入均无效。我在我的代码中看不到任何逻辑错误,所以我想征求第二意见。代码如下:

/*
 * Determines if the input string is valid.
 * 
 * A string is considered valid if it begins with either a number (2-10) 
 * or a letter (J/j, Q/q, K/k) to deetermine rank, followed by a letter to
 * determine suit (C/c, D/d, H/h, S/s).
 */
bool inputValidator(string cardData)
{
    if (cardData.length() == 2) //Input string is two characters long
    {
        if (cardData[0] < '2' || cardData[0] > '9'
            || cardData[0] != 'J' || cardData[0] != 'j'
            || cardData[0] != 'Q' || cardData[0] != 'q'
            || cardData[0] != 'K' || cardData[0] != 'k'
            || cardData[0] != 'A' || cardData[0] != 'a')
        {
            cout << "Card with data " << cardData << " has an invalid rank." << endl;
            return false;
        }
        if (cardData[1] != 'C' || cardData[1] != 'c' //Parse suit
            || cardData[1] != 'D' || cardData[1] != 'd'
            || cardData[1] != 'H' || cardData[1] != 'h'
            || cardData[1] != 'S' || cardData[1] != 's')
        {
            cout << "Card with data " << cardData << " has an invalid suit." << endl;
            return false;
        }
        return true;
    }
    else if (cardData.length() == 3) //Input string is three characters long
        //This occurs only if the number is 10.
    {
        if (cardData[0] != '1' || cardData[1] != '0') //Parse rank
        {
            cout << "Card with data " << cardData << " has an invalid rank." << endl;
            return false;
        }
        if (cardData[2] != 'C' || cardData[2] != 'c' //Parse suit
            || cardData[2] != 'D' || cardData[2] != 'd'
            || cardData[2] != 'H' || cardData[2] != 'h'
            || cardData[2] != 'S' || cardData[2] != 's')
        {
            cout << "Card with data " << cardData << " has an invalid suit." << endl;
            return false;
        }
        return true;
    }
    return false;
}

如果有任何逻辑缺陷(或更好的方法),我将不胜感激。谢谢。

最佳答案

你正在写这样的子句:

cardData[2] != 'D' || cardData[2] != 'd'

这将始终为真,因为被测试的变量不能同时是两个值。您可能打算使用 && 而不是 ||

您当然可以简化逻辑,例如在比较之前将输入转换为小写或大写。

关于c++ - 输入验证不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656064/

相关文章:

c++ - 如何正确检查对象是否实现接口(interface)

c++ - 如果收到事件或超时则终止进程

node.js - NestJs - 类验证器未返回完整的验证错误对象

javascript - 向表单元素添加事件

java - SpringMvc 如何根据用户正在执行的功能对对象使用不同的 validator

c++ - 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440

c++ - 在 STL vector 中管理作用域和对象生命周期

javascript - 浮点表示似乎可以正确地进行整数运算——为什么?

javascript - Angular 表单验证 - 将毫秒转换为有效日期对象

没有注释的 spring 中的 Java 对象验证