C - 显示功能不打印任何内容;使用参数显示功能时遇到问题

时间:2018-02-28 00:25:19

标签: c

我今天必须编写一副卡片生成程序,但我不确定为什么控制台窗口在运行时没有任何结果。目的是让它打印结构阵列中的所有卡片:" ... [42 4-C] [8 9-H] [43 5-S] [33 8-D] [34 9-C] [21 9-D] ......"。我摆脱它之前的最后一次构建错误是当我试图在DealCards()的参数中使用LoadDeck()时,它说singlecard与singlecard *不兼容。我通过制作一个新的struct singlecard数组,并使用memcpy和LoadDeck()返回单个数组来消除错误。需要一些帮助。

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

1 个答案:

答案 0 :(得分:0)

我会添加评论,但没有分数所以“回答”是方式......

除了%13和%4以及基于零的索引和随机数生成之外,还有其他问题需要解决:

  • 您指定函数LoadDeck返回单个结构,但您编写它返回数组
  • memcpy使用函数的名称作为参数,这个函数声明返回一个应该触发SEGV的结构(我认为),而是获取一个结构数组,因此可能会欺骗运行时系统
  • LoadDeck的memcpy使用“52”作为“要复制的字节”参数但是应该指定“52 * sizeof(struct)”来复制
  • 您在LoadDeck中指定数组在函数中声明,但将该数组返回到单结构插槽中。这是不正确的,因为您无法返回本地到函数变量,因为它在函数出口处超出范围,并且该内存位置可能会被其他操作破坏。这也是不正确的,因为“单个插槽”在调用堆栈中与完整阵列不同。