c - C语言中如何比较两个指针的值

标签 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;
}

最佳答案

此算法的最大问题是您将卡片与其自身进行比较:您将 ij 都从零开始,因此在配对时会出现误报卡本身。

解决此问题的一个简单方法是在 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;

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

相关文章:

c - 如何使用 C 将日期和时间传递给结构变量

c - 将 void 指针与 C 中的类型化指针进行比较(为了相等)是 UB 吗?

c - 指向二维数组的一维指针

c - 应用于数组名称的 sizeof 与指向数组第一个元素的指针

c - 将 strcpy 应用于指向数组的指针 + some_offset

arrays - 如何在 Swift 中打印结构的某些元素?

检查结构是否已经初始化或分配了一些内存

c - 为指针分配内存

c - 如何循环用户输入并将其复制到文件,直到使用 C 输入 "exit"字符串?

在C中创建动态大小的二维数组