结构数组中的C++设置元素 P>所以我的代码现在使用的是仿真堆栈来创建一副卡,因为我无法计算如何在C++中实现一个真正的堆栈。然后将这些牌洗牌,然后将该层分成两半,传递给两个玩家P1和P2。然后,允许用户查看p1的牌,这些牌的编号从1到26,用户可以选择1到26的数字来选择该牌并将其投入游戏

结构数组中的C++设置元素 P>所以我的代码现在使用的是仿真堆栈来创建一副卡,因为我无法计算如何在C++中实现一个真正的堆栈。然后将这些牌洗牌,然后将该层分成两半,传递给两个玩家P1和P2。然后,允许用户查看p1的牌,这些牌的编号从1到26,用户可以选择1到26的数字来选择该牌并将其投入游戏,c++,arrays,function,struct,null,C++,Arrays,Function,Struct,Null,基本上,我需要有代码来遍历p1的卡,查看您选择的卡是否等于p1的卡堆栈中的一张卡,如果它们相等,那么我需要将该元素设置为NULL。 唯一的问题是p1的数组由字符和整数组成,因为它是一个结构数组。否则,将内容设置为NULL将不会是问题 在我得到您选择的等于NULL的特定元素之后,我必须将该NULL元素后面的所有元素向前推一个空格,类似于 p1[x] = p1[x+1]; 下面是我的代码的开头,其中struct是,main是: struct Card{ char suit[10]; in

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

在我得到您选择的等于NULL的特定元素之后,我必须将该NULL元素后面的所有元素向前推一个空格,类似于

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);
                  }   
               }
            }
         }
      }
   }
}
在本部分:

if(p1[y].suit = NULL)
您应该比较,而不是分配:

if(p1[y].suit == NULL)
现在,关于C++98文档中的作业:

空指针常量是一个整型常量表达式 计算结果为零,例如0或0L

默认情况下,它是一个void*指针,但如果需要,可以将其转换为int。比如:

p1[cardNumber].number = (int) NULL;
这与分配给0相同:

p1[cardNumber].number = 0;
现在,这一条毫无意义:

p1[cardNumber].suit = NULL;
您正在为字符集[10]的向量赋值NULL。您可以像我前面讨论的那样,通过强制转换将每个向量位置指定为0或NULL,或者根据需要使用指针和alloc。如果您使用:

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

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

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) {}
};


我没有仔细查看您的代码,甚至可能没有必要使用无效选项。Suit的enum肯定是一个不错的选择。

如果你在if中做赋值,那么当你应该做一个比较时,当你应该只赋值0时,你尝试赋值NULL。NULL表示指针,0表示数值。如果您声明一个变量int i=0但int*i=NULL。此外,如果你需要一个栈的现成实现,用C++你可以使用STD::StUng.使用一个像向量一样的标准容器,一旦找到卡片,就将其从向量中删除。我想如果我有p1[cardNumber].number=0,那么我可以在if语句中检查它是真是假,所以是的,这部分工作正常。我只是想与p1[cardNumber].number=0一起使用;我必须做p1[cardNumber].suit=;也可以,但我可以检查数字条件。谢谢几乎正确,但您有一些误解和术语问题。首先,C++中的向量是定义好的,意味着别的东西。事实上,不要把STD::向量定义为一个定义良好的、语言无关的向量,但不要把它与STD::数组错误!
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