C++ 设置结构数组中的元素 = NULL

C++ Setting Element in Struct Array = NULL

所以我的代码现在做的是使用模拟堆栈创建一副纸牌(因为我不知道如何在 C++ 中实现真正的堆栈)。然后洗牌,然后洗牌被分成两半并传递给两个玩家,p1p2。然后允许用户查看 p1 编号为 1 到 26 的牌,用户可以 select 从 1 到 26 的数字来选择那张牌并将其投入游戏。

我基本上必须有代码来检查 p1 的牌,看看你选择的牌是否等于 p1 的牌堆中的一张牌,如果它们相等,那么我需要将该元素设置为 NULL。 唯一的问题是 p1 的数组由字符和整数组成,因为它是一个结构数组。否则,设置为 NULL 也不是问题。

在我得到你选择的等于 NULL 的特定元素后,我必须将所有元素推到 NULL 元素之后,一个 space 向前,所以像

p1[x] = p1[x+1]; 

这是我的代码的开头,struct 所在的位置和 main 所在的位置:

struct Card{
  char suit[10];
  int number;
};

void playGame(Card p1[], Card p2[]);
void fillDeck(Card *deck);
void fillPlayerDeck(Card deck[], Card p1[], Card p2[]);
void printDeck(Card deck[], Card p1[], Card p2[]);
void shuffleDeck(Card *deck);
void throwCard(Card p1[], Card p2[], Card p1cardsThrown[], Card p2cardsThrown[]);
//string toString(Card p1[], Card p2[], Card p1New[], Card p2New[]);

int main (int argc, char *argv[]){
   Card deck[52];
   Card p1[26];
   Card p2[26];
   //Card p1New[26];
   //Card p2New[26];
   Card p1cardsThrown[26];
   Card p2cardsThrown[26];
   fillDeck(deck);
   shuffleDeck(deck);
   fillPlayerDeck(deck, p1, p2);
   printDeck(deck, p1, p2);
   throwCard(p1, p2, p1cardsThrown, p2cardsThrown);
   //playGame(p1, p2, p1cardsThrown, p2cardsThrown);  
}

这是问题代码,我的 throwCard 函数:

void throwCard(Card p1[], Card p2[], Card p1cardsThrown[], Card p2cardsThrown[]){
   printf("\nWhich of your cards would you like to play?\n");
   int i = 0;
   for(i; i < 26; i++){
      printf("%d: %d of %s\n", i, p1[i].number, p1[i].suit);
   }
   int cardNumber;
   cin >> cardNumber;
   printf("You chose %d: the %d of %s!", cardNumber, p1[cardNumber].number, p1[cardNumber].suit);


   //HERE IS WHERE THE PROBLEM IS ACTUALLY HAPPENING
   //check which card was thrown, then move that card out of array
   for(int x = 0; x<26; x++){
      if(p1[cardNumber].number = p1[x].number){
         if(p1[cardNumber].suit = p1[x].suit){
            p1[cardNumber].number = NULL;
            p1[cardNumber].suit = NULL;
            for(int y = x; y < 26; y++){
               if(p1[y].number = NULL){
                  if(p1[y].suit = NULL){
                     p1[y] = p1[y + 1];
                     printf("This is P1's new deck");
                     printf("%d: %d of %s\n", x, p1[x].number, p1[x].suit);
                  }   
               }
            }
         }
      }
   }
}

下面是我收到的确切错误:

EgyptianRatScrew3.cpp: In function 'void throwCard(Card*, Card*, Card*, Card*)':
EgyptianRatScrew3.cpp:54:33: error: invalid array assignment
          if(p1[cardNumber].suit = p1[x].suit){
                                 ^
EgyptianRatScrew3.cpp:55:35: warning: converting to non-pointer type 'int' from NULL [-Wconversion-null]
             p1[cardNumber].number = NULL;
                                   ^
EgyptianRatScrew3.cpp:56:33: error: incompatible types in assignment of 'long long int' to 'char [10]'
             p1[cardNumber].suit = NULL;
                                 ^
EgyptianRatScrew3.cpp:58:32: warning: converting to non-pointer type 'int' from NULL [-Wconversion-null]
                if(p1[y].number = NULL){
                                ^
EgyptianRatScrew3.cpp:59:33: error: incompatible types in assignment of 'long long int' to 'char [10]'
                   if(p1[y].suit = NULL){
                                 ^

这部分:

if(p1[y].suit = NULL)

你应该比较,而不是赋值:

if(p1[y].suit == NULL)

现在,关于作业,来自 C++98 文档:

A null-pointer constant is an integral constant expression that evaluates to zero (such as 0 or 0L).

默认情况下它是一个指针 (void*),但如果需要,您可以转换为 int。喜欢:

p1[cardNumber].number = (int) NULL;

这与分配给 0 相同:

p1[cardNumber].number = 0;

现在这个,完全没有意义:

p1[cardNumber].suit = NULL;

您正在将 NULL 分配给字符向量 (char suit[10])。您可以将每个向量位置分配给 0(或 NULL,如我之前讨论的那样进行强制转换),或者使用指针,并根据需要进行分配。如果您使用:

struct Card{
  char *suit;
  int number;
};

这变得有效:

p1[cardNumber].suit = NULL;

作为奖励,您可以节省一些内存!您可以将花色的字符串指针分配给卡片,瞧,一切正常。

你这里有一些问题。让我们从您的 if 语句开始:

if(p1[cardNumber].number = p1[x].number)

if(p1[cardNumber].suit = p1[x].suit)

if(p1[y].number = NULL)

if(p1[y].suit = NULL)

这些都是作业。您想要使用 == 来比较值,而不是 =,它分配给它们:

if(p1[cardNumber].number == p1[x].number)

if(p1[cardNumber].suit == p1[x].suit)

if(p1[y].number == NULL)

if(p1[y].suit == NULL)

NULL 用于指针。 char[10]int 都是非指针,因此将 NULL 分配给它们是无效的,也没有意义。 NULL 也只是 0 的一个宏,如果你有 C++11,你应该使用 nullptr

在我看来,理想的解决方案是更改您的 Card 结构并稍微检查一下:

enum class Suit //declare an enum to represent suit type
{
   Invalid,
   Spades,
   Hearts,
   Clubs,
   Diamonds
}

struct Card
{
    Suit suit_value;
    int card_value;

    Card() : suit_value(Suit::Invalid), card_value(0) {}
};

if(p1[y].number == 0)// have -1 or 0 be an invalid number

if(p1[y].suit = Suit::Invalid)// check for invalid suit

我没有仔细看你的代码,有无效选项甚至可能没有意义。 enum for Suit 绝对是正确的选择。