今天,我不得不编写一副纸牌生成程序,但是我不确定为什么在运行控制台窗口时什么都没显示。目的是让它打印出结构数组中的所有卡,例如:“ ... [42 4-C] [8 9-H] [43 5-S] [33 8-D] [34 9-C ] [21 9-D] ...”。在摆脱此错误之前,我遇到的最后一个构建错误是当我尝试在DealCards()参数中使用LoadDeck()时,它说单卡与单卡*不兼容。我通过制作一个新的结构单卡数组并使用带有返回单卡数组的LoadDeck()的memcpy摆脱了错误。需要一点帮助。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
struct singlecard LoadDeck();
bool CheckDup(int trialNum, struct singlecard deck[]);
char LoadFace(int cardnum);
char LoadSuit(int cardnum);
DealCards(struct singlecard deck[]);
struct singlecard
{
int cardnum;
char face;
char suit;
};
int main()
{
struct singlecard aNewDeck[52];
memcpy(aNewDeck, LoadDeck(), 52);
DealCards(aNewDeck);
}
struct singlecard LoadDeck()
{
struct singlecard deck[52];
srand(time(NULL));
int i=0;
int r = 1 + rand() % 52;
while (i < 52)
{
if (CheckDup(r, deck) == false)
{
deck[i].cardnum = r;
deck[i].face = LoadFace(r);
deck[i].suit = LoadSuit(r);
i++;
}
}
return deck[52];
}
bool CheckDup(int trialNum, struct singlecard deck[])
{
bool duplicate = false;
int i = 0;
while (i < 52 || duplicate == false)
{
if (trialNum = deck[i].cardnum)
{
duplicate = true;
}
else
{
i++;
}
}
return duplicate;
}
char LoadFace(int cardnum)
{
char faces[] = { 'A','2','3','4','5','6','7','8','9','T','J','Q','K' };
int factor = cardnum % 14;
return faces[factor];
}
char LoadSuit(int cardnum)
{
char suits[] = { 'H','D','C','S' };
int factor = cardnum % 5;
return suits[factor];
}
DealCards(struct singlecard deck[])
{
for (int i = 0; i < 52; i++)
{
printf("[%d %c-%c]", deck[i].cardnum, deck[i].face, deck[i].suit);
}
}
最佳答案
我会添加评论,但没有要点,因此“答案”是方法...
除了%13和%4以及从零开始的索引编制和随机数生成之外,还需要解决其他问题:
您指定函数LoadDeck返回一个单一的结构,但是您将其编码为返回一个数组
memcpy使用函数名称作为参数,该函数被声明为返回单个结构,该结构应触发SEGV(我认为),但获取结构数组,因此可能使运行时系统蒙混
LoadDeck的memcpy使用“ 52”作为“要复制的字节”参数,但应指定“ 52 * sizeof(struct)”进行复制
您在LoadDeck中指定了在函数中声明该数组,但是将该数组返回到单结构插槽中。这是不正确的,因为您不能返回本地函数变量,因为它在函数出口处超出范围,并且该内存位置可能会被其他操作破坏。这也是不正确的,因为调用堆栈中的“单个插槽”与完整阵列不同。