[英]How to compare the values of two pointers in C
我下面的函数总是返回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
都从零开始,因此将每张卡与自身配对时会出现误报。
一个简单的解决方法是将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
用于面部和西服表示,并为每个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;
};
result
被设置为true的第一个(和,因为它发生在每一个)的i循环迭代,因为在每次迭代中的某个时刻, j==i
,因此,你要比较自身相同的数组元素。 您仅应在i!=j
时执行if语句。
不过,就您的原始观点而言,您并不是在比较指针,而是在比较实际值。 数组[]方括号用于取消引用指针;
wHand[i]
与*(wHand + i)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.