我正在尝试用 c 创建一个简单的扑克游戏,但很难使用循环将我的纸牌结构放入数组中,这样我就不必单独创建每个纸牌对象,然后手动将它们放入数组中一个。我对java比较熟悉,知道我可以使用“new className(类参数)”方法在数组中输入新对象,而无需一一命名和初始化它们。这本质上就是我在 java 中要做的事情,我想知道是否有办法使用 c 来做到这一点。
for(int i = 0; i < 14; i++){
table_deck.deck[i] = new card("diamonds", i);
}
我尝试做附加的照片,但无法通过编译。我希望有某种方法可以做到这一点,而无需手动单独初始化 52 张卡,然后将它们单独插入我的数组 52 中。
C 不像 Java 那样有类。最接近的替代品是可以存储成员的
struct
。 Java new
的作用是为类的新实例分配内存。 C 中最接近的等效项是使用 malloc()
并分配字段:
struct card {
char suit[9];
int value;
};
struct card *my_card = malloc(sizeof(struct card));
my_card->name = "diamonds";
my_card->number = 7;
free(my_card);
或者只是声明/使用堆栈变量:
struct card my_card = {"diamonds", 7};
如果您喜欢将参数传递给函数的想法:
struct card card_init(char *suit, int value) {
struct card tmp;
strcpy(tmp, suit);
card.value = value;
return tmp;
}
查看图像后,您正在寻找的语法称为复合文字:
for(int i = 0; i < 14; i++){
table_deck.deck[i] = (struct card){"diamonds", i};
}
这个 OP 链接的代码似乎想要将结构值分配给数组元素:
for (int i = 0; i < 14; i++) {
table_deck.deck[i] = struct card {"diamonds", i};
}
上面的代码在 C 语言中不合法,但是您可以使用 compoundliteral 来完成此操作:
for (int i = 0; i < 14; i++) {
table_deck.deck[i] = (struct card){"diamonds", i};
}
复合文字创建一个未命名的对象,如果它出现在任何函数之外,则该对象具有静态存储持续时间。否则,未命名对象具有自动存储持续时间,该持续时间在退出复合文字所在的块时结束。
一般来说,您必须小心通过复合文字创建的对象的生命周期。上述代码中的复合文字出现在
for
循环体中,并且它们的存储仅限于该块。赋值 table_deck.deck[i] = (struct card){"diamonds", i};
将未命名结构的内容复制到索引结构 table_deck.deck[i]
。
这里使用复合文字只是为了方便。完成同样事情的另一种方法是直接分配给相关字段。您可以修改
suit
结构体的 card
字段以接受指向 char
的指针,或者更好地接受指向 const char
的指针。然后可以将字符串文字(在静态内存中衰减为指向 char
的指针)分配给该指针:
struct card {
const char *suit;
int value;
};
/* ... */
int main(void) {
/* ... */
for (int i = 0; i < 14; i++) {
table_deck.deck[i].suit = "diamonds";
table_deck.deck[i].value = i;
}
/* ... */
}
或者您可以保留
card
结构体,并将字符复制到 suit
字段中:
#include <stdio.h>
#include <string.h>
struct card {
char suit[9];
int value;
};
/* ... */
int main(void) {
/* ... */
for (int i = 0; i < 14; i++) {
strcpy(table_deck.deck[i].suit, "diamonds");
table_deck.deck[i].value = i;
}
/* ... */
}
如果您选择尝试这样的解决方案,您必须确保尝试复制到
suit
字段中的任何字符串都适合(包括 \0
终止符)。您可能想使用 strncpy
来代替,但这会带来自己的问题,因为 strncpy
可以离开其目标数组而不会出现空终止。