为什么在达到 "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
,或者在调用方中创建对象并将其地址传递给此函数。
在 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
,或者在调用方中创建对象并将其地址传递给此函数。