为什么在达到 "A Spade" 之前抽一张牌会输出不同的结果

Why drawing a card until "A Spade" is reached outputs different results

在 do-while 循环中,必须绘制一张新卡,直到它不满足 requirements.When 卡是 "A Spade" 我们应该将它添加到牌组中,然后停止随机抽取 cards.Sometimes 输出以 "A Spade" 结束,但有时它是一些不同的卡 type.I 相信代码有问题。

#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

const char const available_values[13] =
{
    '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'
};

const char* const available_paints[4] =
{
    "club", "diamond", "heart", "spade"
};

typedef struct card_t
{
    char value;
    char* paint;
} Card;

void initialize_card(Card* card)
{
    int value_index = rand() % 13;
    int paint_index = rand() % 4;

    card->value = available_values[value_index];
    card->paint = available_paints[paint_index];
}

Card* card_draw()
{
    Card card;
    initialize_card(&card);

    return &card;
}

int main() {
    srand((unsigned int)time(NULL));
    unsigned count = 0;
    Card* card;
    Card* old_deck = NULL;
    Card* new_deck;
    do {
        new_deck = old_deck;
        count++;
        old_deck = calloc(count, sizeof(Card));
        if (!old_deck) {
            printf("Memory allocation error");
            break;
        }
        for (unsigned i = 0; i < count-1; i++) {
            old_deck[i] = new_deck[i];
            free(new_deck);
        }
        card = card_draw();
        old_deck[count-1] = *card;

        printf("%c %s\n\n", card->value, card->paint);

    } while (card->value != 'A' && card->paint != "Spade");

    return 0;
}

新版本:

Constant.h: https://pastebin.com/av9pBabk

Main.cpp: https://pastebin.com/jJttNWjj

希望对大家有用,谢谢大家!

Card* card_draw()
{
    Card card;
    initialize_card(&card);

    return &card;
}

此函数的 return 值无用。这是card的地址。但是一旦函数 returns,card 就不再存在,因为它是函数的局部变量。所以这个函数的return值不能用

    card = card_draw();
    old_deck[count-1] = *card;

糟糕,您从 card_draw 中取消引用指针 return,但它指向一个不再存在的对象,因此无法取消引用。

通过值而不是指针使此函数 return 成为 Card,或者在调用方中创建对象并将其地址传递给此函数。