今天,我不得不编写一副纸牌生成程序,但是我不确定为什么在运行控制台窗口时什么都没显示。目的是让它打印出结构数组中的所有卡,例如:“ ... [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中指定了在函数中声明该数组,但是将该数组返回到单结构插槽中。这是不正确的,因为您不能返回本地函数变量,因为它在函数出口处超出范围,并且该内存位置可能会被其他操作破坏。这也是不正确的,因为调用堆栈中的“单个插槽”与完整阵列不同。

08-16 19:47