C 如何一次性打印结构中的所有值?

C 如何一次性打印结构中的所有值?,c,struct,printf,C,Struct,Printf,在这里,我将有一个4,5,6,25的输出。 如何在一次尝试中打印结构中的所有成员,而不是每次访问结构中的单个成员。 例如,如果我需要行[4 5 6]和年龄为25的输出。 请帮忙 #include<stdio.h> typedef struct person { int row[3]; int age; } PERSON; int main() { PERSON p; PERSON *pptr=&p; pptr->row[0] = 4; ppt

在这里,我将有一个4,5,6,25的输出。 如何在一次尝试中打印结构中的所有成员,而不是每次访问结构中的单个成员。 例如,如果我需要行[4 5 6]和年龄为25的输出。 请帮忙

#include<stdio.h>

typedef struct person
{
  int row[3];
  int age;
} PERSON;

int main()
{
  PERSON p;
  PERSON *pptr=&p;
  pptr->row[0] = 4;
  pptr->row[1] = 5;
  pptr->row[2] = 6;
  pptr->age = 25;
  printf("%d\n",pptr->row[0]);
  printf("%d\n",pptr->row[1]);
  printf("%d\n",pptr->row[2]);
  printf("%d\n",pptr->age);
  return 0;
}

在一条printf语句中可以使用多个格式说明符

printf("[%d, %d, %d], age=%d\n",
       pptr->row[0], pptr->row[1], pptr->row[2], pptr->age);

在允许您使用元编程和traits的语言中,您可以做到这一点,但在C语言中没有办法做到这一点。simonc的答案是几乎所有人都使用的解决方案。

C并没有提供一种自动的方法来实现这一点

当然,您可以编写自己的print\u struct\u person函数,但您必须为每个要打印的函数编写一个函数


如果您这样做是为了调试,您应该尝试一个真正的调试器:调试器可以做到这一点。

没有一种方法可以在不访问每个成员的情况下立即打印,但是 可以通过使用多个说明符稍微减少此代码。考虑创建 如果需要打印多个结构的值,可以使用函数甚至宏 这将有助于减少代码量

void
print_person (PERSON *p)
{
    printf(
        "[%d %d %d] %d\n",
        p->row[0],
        p->row[1],
        p->row[2],
        p->age
    );
}

print_person(&my_person);
使用指针方法可以避免将整个结构复制为参数。 但您可能更喜欢使用这些简单的结构使其保持简单。宏 方法:

#define PRINTP(p) printf("[%d %d %d] %d\n", p.row[0], p.row[1], p.row[2], p.age)

PRINTP(p);
试试这个:

void print_at_once(PERSON *pptr)
{
  int i=0;
  for(i=0;i<3;i++)
    printf("%d\n",pptr->row[i]);
  printf("%d\n",pptr->age);
  return;
}
如果使用glibc GNU libc,因此仅在使用gcc时可用,尽管不是portbale,但可以定义和注册新的转换说明符,用于glibc实现printf系列函数,这些函数能够满足OP的要求

有关更多信息,请阅读此处:和此处:


这里可以找到一个示例:

如果不访问每个成员,就无法打印。不过,您可以编写一个函数来帮助您做到这一点。您也可以编写一个抽象函数,通过传递指向结构的指针和指向结构中成员类型和偏移量表的指针来为结构类型执行此操作。但是,除非你真的需要更抽象的版本,否则我会选择simonc的答案。@nhahtdh:对于使用GNU的glibc的不可移植解决方案,请参阅我的答案。你应该在你的答案中提到,这是不可移植的,尽管它可能不是很明显。
void print_at_once(PERSON *pptr)
{
  int i=0;
  for(i=0;i<3;i++)
    printf("%d\n",pptr->row[i]);
  printf("%d\n",pptr->age);
  return;
}