【问题标题】:Can I use strings within an array to name struct variables using concatenation, macros, or similar?我可以在数组中使用字符串来使用连接、宏或类似方法命名结构变量吗?
【发布时间】:2022-06-29 12:37:08
【问题描述】:

我有一组动物名称,按照我打算创建每个结构“动物”的顺序,并将其存储在farm_animals,一个动物结构中。

typedef struct ani animal;

animal* farm_animals[128] = {0};

尽管下面的代码完全无效,但我将其包含在此处以准确显示我在实践中的想法。我想声明一个与数组中的字符串文字相对应的动物类型变量,然后以某种方式将该文字用作动物的名称并将其存储在数组中。

char* animal_names [] = {\"Oliver\", \"Marcus\", \"Mike\", \"John\", \"Tom\", \"Daisy\", \"Lilac\", \"Rose\", \"Jim\"};

    for (int i = 0; i < 9; i++) { 
        animal animal_names[i];
        farm_animals[i] = animal_names[i];
    }

我研究并发现了许多其他类似的帖子,这些帖子得出的结论是,由于 C 是一种编译而非解释的语言,因此不可能用字符串的值命名变量。但是,我想知道是否可以将字符串名称与后缀(如索引号)连接起来以创建一个全新的“字符串名称”来引用动物。我也有一个使用数组或相同animal_names 数组的宏,但这对于我作为初学者来说还不清楚。

我认为 C 中的这种想法有些牵强,但我真的想知道是否有一种方法可以使用 for 循环和名称数组来命名这些结构,而不是手动创建 100 多个结构。

  • 您需要某种地图数据结构 - 哈希表、树等,以便在运行时为事物命名。
  • \" 不能用字符串的值来命名变量\" 那是因为这没有意义在运行时值之后命名变量。变量名存在独自为了程序员的利益,它们不存在于编译的二进制文件中,也与程序的用户/输入无关。
  • 我不敢想象。

标签: arrays c namespaces c-strings identifier


【解决方案1】:

是的,不可能在 C 中动态命名变量。如果我理解正确,您想创建一个与字符串对应的动物类型,然后将其命名为该名称。

使用structs 的优点是您可以将相关/相关数据组合成一个变量(结构)——它本身就是多个变量的集合。

我建议组织这样的事情:

typedef struct animal {
  char[20] name;
  char[20] type;
} animal;

您也可以将字符数组替换为指向字符串 (char*) 的指针。此外,如果您知道可以创建的动物类型,您可以创建一个 enum,如下所示:

#define MAX_NAME_LEN 20
#define MAX_NUM_ANIMALS 10

enum animalType {
  LION,
  ELEPHANT,
  FALCON,
  PARROT
};

typedef struct animal {
  char[MAX_NAME_LEN] name;
  enum animalType type;
} animal;

int main(void) {
  animal listOfAnimals[MAX_NUM_ANIMALS];

  listOfAnimals[0].type = PARROT;
  listOfAnimals[0].name = "my parrot";

  return 0;
}

因此,您将创建一个结构数组并将动物的类型存储为数据成员,而不是创建 100 多个结构。然后,您可以根据需要使用一些映射机制或条件逻辑将这些类型分配给结构变量。

【讨论】:

  • 我是编程新手,所以如果您能澄清在这种情况下使用了哪些类型的映射机制,我将不胜感激? IMO 它将基于其他结构字段的值(如特定名称产生特定类型,反之亦然)或对应于另一个数组元素的索引号。
  • 您是否只想命名字符串数组中已有的名称?那将非常简单——只需循环遍历字符串数组并将字符串一一分配给结构数据成员:listOfAnimals[i] = animalNamesStr[i]
猜你喜欢
  • 2018-06-17
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-14
  • 2020-10-18
相关资源
最近更新 更多