由其成员选择一个随机结构

Choosing a random struct by its members

我必须在 C 中为一个教育软件项目建模周期性的 table(这基本上是一个测验)。

我已经创建了一个结构并声明了所有元素。现在我必须编写一个随机选择一个元素的函数。

这是我的结构:

typedef struct{
        char name[15];
        char shortname[3];
        int group;
        int period;
}element;
element hydrogen={"hydrogen", "H", 1, 1}, helium={"Helium", "He", ...

我已经尝试将它们组合成一个数组,然后生成一个随机索引:

element elements[118];
elements[1] = {"hydrogen", "H", 1, 1};

但这给了我错误:(

有什么想法吗?

您可以使用指定的初始化程序:

element elements[118] =
{
  [0] = {"hydrogen", "H", 1, 1},
  [1] = {"helium", 18, 1},
  ...
};

更好的是,您可以使用枚举摆脱 "magic numbers":

typedef enum
{
  ELEMENT_H,
  ELEMENT_He,
  ELEMENT_Li,
  ...

  NUMBER_OF_ELEMENTS
} element_t;

element elements[] =
{
  [ELEMENT_H]  = {"hydrogen", "H", 1, 1},
  [ELEMENT_He] = {"helium", 18, 1},
  ...
};

_Static_assert(sizeof(elements)/sizeof(elements[0]) ==  NUMBER_OF_ELEMENTS, 
               "Missing elements!");

不过请注意,这将是零索引的,这与周期性 table 不同。所以你想打印周期性的 table 数字,你必须在打印时使用 +1 。 (或者你可以在数组的开头留下一个垃圾项,但这是草率的编程。)

该方法应该有效。 设置一个结构数组,然后取 index = rand() % 118。您设置结构列表的语法是问题所在。尝试

struct element elements[118] = {
 {"hydrogen", "H", 1, 1},
 {"helium", "He", 2, 4},

  ... etc 
};

您在 C 名称中使用了 C++ = 运算符心态 space。那是你的错误。你在名字space"C".

::= 将所有成员元素从一个隐式复制到另一个的运算符在 C 中不存在。

相反,您必须逐个元素显式复制所有成员。

所以:

strncpy (elements[1].name, "hydrogen", strlen("hydrogen"));
strncpy (elements[1].shortname, "H", strlen("H"));
elements[1].group =  1;
elements[1].period = 1;

将是正确的方法。内联函数或#define 将使它更容易执行并在以后忘记。