我正在尝试解析来自文件的输入以表示一副标准纸牌(即 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/