输入验证不起作用
Input validation not functioning
我试图解析文件中的输入,以表示一副标准牌(即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'
这将永远是真的,因为被测试的变量不能同时是两个值。您可能打算使用&&
而不是||
。
您当然可以简化逻辑,例如,在比较之前将输入转换为小写或大写
问题似乎在于您组合条件的方式。如果我正确理解你的期望,你想要的第一个条件是:
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')
你想要的第二个条件是:
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')
您可以稍微简化条件:你的条件必须改变才能做你想做的事。
bool inputValidator(string cardData)
{
if (cardData.length() == 2) //Input string is two characters long
{
if (!((cardData[0] >= '2' && cardData[0] <= '9')
|| (cardData[0]|32) == 'j'
|| (cardData[0]|32) == 'q'
|| (cardData[0]|32) == 'k'
|| (cardData[0]|32) == 'a'))
{
cout << "Card with data " << cardData << " has an invalid rank." << endl;
return false;
}
if (!((cardData[1]|32) == 'c' //Parse suit
|| (cardData[1]|32) == 'd'
|| (cardData[1]|32) == 'h'
|| (cardData[1]|32) == '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]|32) == 'C' //Parse suit
|| (cardData[2]|32) == 'd'
|| (cardData[2]|32) == 'h'
|| (cardData[2]|32) == 's'))
{
cout << "Card with data " << cardData << " has an invalid suit." << endl;
return false;
}
return true;
}
return false;
}
第二个/第三个字符的代码重复也应该重构。
您的逻辑表达式不正确,而且您正在复制代码,请尝试将它们简化为函数。
bool inputValidator(string cardData)
{
if (cardData.length() == 2 && IsValidCard(cardData[0])) //Input string is two characters long
{
return IsValidSuite(cardData[1]);
}
else if(cardData.length() == 3)
{
if (isValidRank(cardData[0]))
{
return IsValidSuite(cardData[2]);
}
}
return false;
}
bool isValidRank(char c)
{
if (c =='0' || c=='1')[
{
return true;
}
return false;
}
bool IsValidCard(char c)
{
if (c > '2' && c < '9')
{
return true;
}
switch(c)
{
case 'J':
case 'j':
case 'Q':
case 'q':
case 'K':
case 'k':
case 'A':
case 'a':
return true;
}
return false;
}
bool IsValidSuite(char c)
{
switch(c)
{
case 'C':
case 'c':
case 'D':
case 'd':
case 'H':
case 'h':
case 'S':
case 's':
return true;
}
return false;
}
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- Vulkans LunarG验证层不起作用
- C++(否定验证不起作用
- 身份验证标头在 ONVIF 请求中不起作用
- 用于对哈希进行签名并验证哈希签名不起作用的 MSDN C 示例程序
- TerminateProcess对已验证的进程id不起作用
- 用户输入的验证不起作用
- 输入验证不起作用