在c中混洗一个(struct)数组

时间:2017-03-07 10:13:00

标签: c

有人可以告诉我如何随机化一组结构。 我在线搜索并看过很多关于randomsize数组的教程。 但我不认为他们在我的场景中工作......

我一直收到错误.exe停止工作.....

我认为问题来自

  card[i] = i + 1;
  card[i] = card[j];
  card[j] = temp;

有人可以帮助我使用我的代码,我正在尝试随机化/随机播放阵列卡[]。例如:

卡[0]是Ace            心            红色 卡[1]是两个            心            红色 ... 等等 我希望他们成为 card [0]现在是其他卡片。

struct Cards
{
  int suits;
  int values;
  int colour;
};

struct Cards card[52];

void printcard();
void filldeck(); /* Populates a deck of cards */
void printdeck();
void shuffle();

int main()
{
  /* code */
  printcard();
  filldeck();
  printdeck();
  shuffle();
  printdeck();
  return 0;
}


void shuffle()
{
   printf("%s\n\n", "---------------------- Shuffling deck ----------------------");
   int i=0;
   int j=0;
   int temp=0;
   int card[52];

   srand(time(NULL));

   for (i=0;i<52;i++)
   {
      j = (rand()%51) + 1;
      temp = card[i];
      card[i] = card[j];
      card[j] = temp;
   }
   return;
}

3 个答案:

答案 0 :(得分:2)

你有这些陈述:

int i,j,temp;
int card[i];

但您尚未初始化i。因此,您不知道数组card将具有多少元素,并且程序的行为将未定义,可能会导致分段错误。如果您希望数组包含52个元素,请将i初始化为:

int i = 52;

然后声明:

int card[i];

但实际上 ,您想要随机播放的数组是全局数组struct Cards card[52],而不是{{1}中定义的数组cards (参见this link关于变量&#39;范围)。因此,请尝试删除以下代码行:

shuffle

并查看结果是否符合预期。

答案 1 :(得分:1)

此代码存在许多问题。

正如Marievi所说,这一行

int card[i];

应该是

int card[52];

因为我在那时未被初始化(如果您编译时启用了大量警告,则会发现错误。如果您使用的是gcc,请使用-Wall进行编译。

这一行

j = (rand()%51) + 1;

实际上给你一个1到51之间的伪随机数,不包括0和51,我认为这是你想要的,因为它应该是数组的索引。

最重要的是,你正在洗牌的阵列不是带有卡片的阵列。应该是int card[52];的行定义了一个新的本地数组,该数组仅在函数返回之前存在,然后被丢弃。它&#34;阴影&#34;功能期间的全局卡阵列。如果你删除它并摆脱

for (i=0;i<52;i++)
{
   card[i] = i + 1;
}

您将发现您的全局卡阵列已被洗牌。

还有一件事:您不需要将卡片的颜色放在Card结构中。颜色由套装编码。心和钻石都是红色的;俱乐部和黑桃都是黑色的。

答案 2 :(得分:0)

除了已经给出的答案外,为了随机化一包卡片,请注意以下事项: 在函数'shuffle'中,您创建了一个本地数组'card';这会使'struct Cards'类型的全局数组'卡'黯然失色。 您需要做的是在您的随机播放功能中使用全局“卡”而不是本地“卡”。 局部int数组'card'仅在shuffle()内具有生命和可见性。

HTH,Swanand