我的下面的函数总是返回true。我假设是因为我在比较指针。如何比较值而不仅仅是指针。
struct Card {
const char *suit;
const char *face;
};
...
struct Card hand[HAND_SIZE];
...
//Determine whether the hand contains a pair.
bool hasPair(struct Card wHand[]) {
bool result = false;
for (unsigned i = 0; i < HAND_SIZE; ++i) {
for (unsigned j = 0; j < HAND_SIZE; ++j) {
if(wHand[i].face == wHand[j].face && wHand[i].suit == wHand[j].suit) {
result = true;
}
}
}
return result;
}
答案 0 :(得分:2)
此算法的最大问题在于您正在将卡与自身进行比较:您将i
和j
都设置为零,因此您将每张卡与自身配对会产生误报。
对此的一个简单修复是在j
处启动i+1
,确保只对不同的卡进行比较。
由于将result
设置为true
是单行道,因此请在找到匹配后立即返回true
:
for (unsigned i = 0; i < HAND_SIZE; ++i) {
for (unsigned j = i+1; j < HAND_SIZE; ++j) {
if(wHand[i].face == wHand[j].face && wHand[i].suit == wHand[j].suit) {
return true;
}
}
}
return false;
注意:这假设face
和suit
在同一代码中设置为字符串常量,如果链接多个目标文件,则可能很脆弱。一个更安全的选择是使用enum
进行face和suit表示,并为每个enum
值创建一个字符串表示数组:
enum Face {
Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace
};
enum Suit {
Spades, Clubs, Diamonds, Hearts
};
struct Card {
enum Face face;
enum Suit suit;
};
答案 1 :(得分:1)
result
在你的i循环的第一个(并且,正如它发生的每一个)迭代中被设置为true,假设在每次迭代中的某个点j==i
,因此你是将相同的数组元素与自身进行比较。您应该只在i!=j
时执行if语句。
尽管如此,你不是在比较指针 - 你正在比较实际值。 array []方括号用于取消引用指针;
wHand[i]
与*(wHand + i)
做同样的事情。