如何使用这些变量名称

时间:2014-06-03 23:37:41

标签: c++ c

我在c中创建一个像这样的结构

struct book {  
   char name;  
   int page;  
} b2,b3,b4;  

如何使用for循环打印这些 我的意思是

for(int i=2 ; i<5 ; ++i)  
    printf("%c %d", b{i}.name , b{i}.page); //bi.name will not work obviously

是否需要进行某种特殊操作?
如果已经在网站上的其他地方回答过,我真诚地道歉。我不知道自己应该准确搜索什么。

3 个答案:

答案 0 :(得分:4)

我有一个解决方案:

存储结构到指针数组并循环显示

struct book **arr = malloc(sizeof(struct book *) * 4);

arr[0] = &b2;
arr[1] = &b3;
arr[2] = &b4;
arr[3] = NULL;

for (int i=0; i < 3; ++i)
{
   printf("%c %d", arr[i]->name , arr[i]->page);
}

修改

或者像其他社区gyus所说的那样,创建一个结构阵列(更容易操作)

示例

struct book books[3];

或者

struct book *books = malloc(sizeof(struct book) * 3);

答案 1 :(得分:1)

您可以使用数组和宏:

struct book {  
   char name;  
   int page;  
};  

#ifndef __cplusplus
struct
#endif
book library[3];

#define b2 (library[0])
#define b3 (library[1])
#define b4 (library[2])

void initialize(void)
{
    b2.name = 'a';
    b2.page = 5;
    b3.name = 'F';
    b3.page = -85;
    b4.name = '$';
    b4.page = 65535;
}


void Print_Library(void)
{
  unsigned int i = 0;
  for (i = 0; i < 3; ++i)
  {
     printf("First character of book %d: %c\n", i, library[i].name);
     printf("Page of book %d: %d\n", i, library.page);
     printf("\n");
  }
}

名称字段是单个字符,而不是字符串。

注意:我使用了#if预处理程序指令,因为结构的实例在C和C ++之间的定义不同,你指定了它们。

编辑1:在运行时按名称访问变量。
虽然我从来不需要在运行时按名称访问变量,但一种方法是将变量映射到它们的名称。

struct book; // forward declaration, see above.

struct Variable_Name_Entry
{
#ifdef __cplusplus  // Required since you tagged both languages
  std::string  name;
  book *       p_variable;
#else
  char         name[16];
  struct book * p_variable;
#endif
};

#ifndef __cplusplus
struct
#endif
Variable_Name_Entry  variable_names[] =
{
  {"b2", &b2},
  {"b3", &b3},
  {"b4", &b4},
};
const unsigned int number_of_variable_names =
  sizeof(variable_names) / sizeof(variable_names[0]);

#ifndef __cplusplus
struct
#endif
book * name_to_variable(const char * p_name)
{
  unsigned int i = 0;
  for (i = 0; i < number_of_variable_names; ++i)
  {
#ifdef __cplusplus
    if (variable_names[i].name == p_name)
#else
    if (strcmp(variable_names[i].name, p_name) == 0)
#endif
    {
      return variable_names[i].p_variable;
    }
  }
  return NULL;
}

您真的需要按名称访问变量,还是有不同的设计?

答案 2 :(得分:0)

您可以收集指向数组中变量的指针,例如像这样在C ++ 11中:

for( auto p : {&b2, &b3, &b4} )
{
    cout << p->name << " " << p->page << endl;
}

我留给你创建类似的C语言解决方案,如果你想要(问题是/被标记为C ++和C)。

在C中,必须手动创建数组,可以这么说。