如何比较C中两个指针的值

时间:2016-11-06 20:40:51

标签: c pointers struct

我的下面的函数总是返回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;
}

2 个答案:

答案 0 :(得分:2)

此算法的最大问题在于您正在将卡与自身进行比较:您将ij都设置为零,因此您将每张卡与自身配对会产生误报。

对此的一个简单修复是在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;

注意:这假设facesuit在同一代码中设置为字符串常量,如果链接多个目标文件,则可能很脆弱。一个更安全的选择是使用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)做同样的事情。