我正在做一个项目,我必须创建一个黑杰克模拟.所以我开始创建一个套牌和一个绘图功能.由于C中没有字符串,我创建了两个指针数组,将它们用作自定义字符串数组.问题在于,当我打印卡片以查看其价值和适合时,只有它第一次打印出预期的内容.第二次是一团糟.谁可以给我解释一下这个 ?这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
char* suit[] = {"Diamonds", "Hearts", "Spades", "Clubs"};
char* facevalue[] = { "Seven", "Eight", "Nine", "Ten", "Jack","Queen", "King", "Ace"};
char* drawCard()
{
char* card[50];
int cardNumber=rand()%8;
int cardColor=rand()%4;
strcpy(card,facevalue[cardNumber]);
char of[]=" of ";
char* xrwma =suit[cardColor];
strncat(card,of,5);
strncat(card,xrwma,8);
return card;
}
int main()
{
srand(time(NULL));
char* c=drawCard();
puts(c);
puts(c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是您正在返回指向自动数组的指针.函数返回后,数组超出范围.尝试取消引用返回的指针会导致未定义的行为.第一次调用puts()虽然在技术上未定义,但恰好适用于您的情况.第二个没有.
请参阅返回指向自动变量的指针以进行讨论.
一种解决方案是在内部分配数组main(),将指针传递给它(及其大小)drawCard()并drawCard()填充它.