我的下面的函数总是返回 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;
}
最佳答案
此算法的最大问题是您将卡片与其自身进行比较:您将 i
和 j
都从零开始,因此在配对时会出现误报卡本身。
解决此问题的一个简单方法是在 i+1
处启动 j
,确保仅比较不同的卡。
由于将 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
来表示面部和西装,并为每个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;
};
关于c - C语言中如何比较两个指针的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454291/