C:用字符串数组初始化结构体

3

我试图做以下操作,但编译器报错说有括号问题,然而我找不到替代方案。

struct cards {
  char faces[13][6], suits[4][9];
}

typedef struct cards cards;

void init_struct(cards *s) {
  s->suits = {"hearts","spades","clubs","diamonds"};
  s->faces = {"ace","two","three","four","five",
              "six","seven","eight","nine"
              "ten","jack","queen","king"};
}

我知道可能有几个重复的帖子,但是它们都没有引导我正确的方向。希望你们中的一位可以帮忙 :) 谢谢

4个回答

2
#include <string.h>

typedef struct cards {
    char faces[13][6], suits[4][9];
} cards;

cards base_card = {
    {"ace","two","three","four","five",
     "six","seven","eight","nine", //forgot "," at nine after
     "ten","jack","queen","king"},
    {"hearts","spades","clubs","diamonds"}
};

void init_struct(cards *s) {
    memcpy(s, &base_card,sizeof(cards));
}

怎么可能行?你正在将一个指向字符串的指针复制到一个字符数组中! - trojanfoe
@trojanfoe 你在开玩笑吗? - BLUEPIXY
很想像这样做,但是我遇到了一些错误: 警告:字符数组的初始化字符串太长 警告:(在“base_card.faces [8]”的初始化附近) -我的代码与您的完全相同,除了我在init_struct函数中有“cards base_card”声明(似乎没有任何区别) - kensing
1
@kensing 你忘了加逗号‘,’。#include <string.h> 是为了使用 memcpy。 - BLUEPIXY
3
你甚至不需要调用memcpy函数,*s = base_card也可以实现同样的效果(结构体是可赋值的)。 - Daniel Fischer
显示剩余2条评论

0
直接初始化语法只能用于初始化,而不能用于赋值。例如,你不能这样做:
char p[2][5];
p = {"a", "b"}; //error

这就是为什么它无法编译。尝试逐个字符串使用strcpy

strcpy(s->suits[0], "hearts");
strcpy(s->suits[1], "spades");
...etc

或者,另外一种方法是初始化一个临时数组,然后将其复制

char suits_tmp[4][9] = {"hearts","spades","clubs","diamonds"};
memcpy(s->suits, suits_tmp, 4*9);

0

在你的struct中使用const char *(我假设没有修改套装/面值实际内容的要求),并单独初始化它们:

struct cards {
    const char *suits[4];
    const char *faces[13];
};

typedef struct cards cards;

void init_struct(cards *s)
{
    s->suits[0] = "hearts";
    s->suits[1] = "spades";
    s->suits[2] = "clubs";
    s->suits[3] = "diamonds";
    s->faces[0] = "ace";
    s->faces[1] = "two";
    s->faces[2] = "three";
    s->faces[3] = "four";
    s->faces[4] = "five";
    s->faces[5] = "six";
    s->faces[6] = "seven";
    s->faces[7] = "eight";
    s->faces[8] = "nine";
    s->faces[9] = "ten";
    s->faces[10] = "jack";
    s->faces[11] = "queen";
    s->faces[12] = "king";
}

当然,如果你只想要一次性的卡牌集合,这是非常合理的,那么这将起作用:

struct
{
    const char *suits[4];
    const char *faces[13];
} cards =
{
    {"hearts","spades","clubs","diamonds"},
    {"ace","two","three","four","five",
        "six","seven","eight","nine",
        "ten","jack","queen","king"}
};

谢谢,尽管这正是我担心不得不做的事情 :) - kensing
@remyabel,你为什么要给我和Armen Tsirunyan投反对票?这是战术性的吗? - trojanfoe

0
#include <string.h>
#include <stdio.h>

struct cards {
  const char** suits;
  const char** faces; 
};

typedef struct cards cards;

const char* suits[4] = {"hearts","spades","clubs","diamonds"};
const char* faces[13] = {"ace","two","three","four","five",
              "six","seven","eight","nine"
              "ten","jack","queen","king"};
int main()
{
    cards deck;
    deck.suits = suits;
    deck.faces = faces;
    printf(deck.suits[0]);
    return 0;
}

这也可以工作。不使用指针。

澄清

我知道我的回答是快速而简单的,但没有strcpymemcpy或一长串的赋值语句。如果您计划为您的游戏使用标准扑克牌,则它将是一个常量值集合。如果您的意图是拥有不同类型的牌组,则我的答案可能不足够。是的,它没有init_struct函数,但您可以轻松修改它以适应您的意图(因为我对C和malloc不熟悉)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接