0

在这个我将有 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;
}
4

7 回答 7

4

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

printf("[%d, %d, %d], age=%d\n",
       pptr->row[0], pptr->row[1], pptr->row[2], pptr->age);
于 2012-12-11T14:40:55.273 回答
1
printf ("[%d  %d  %d]\nage: %d", pptr->row[0],pptr->row[1],pptr->row[2],pptr->age);
于 2012-12-11T14:41:24.753 回答
1

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

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);
于 2012-12-11T14:47:06.353 回答
1

如果使用glibc(GNU libc,因此仅在使用时可用gcc,虽然不是 portbale),是否可以定义和注册“新”转换说明符以用于glibc'sprintf函数族的实现,这些函数能够执行 OP在寻找。

有关这方面的更多信息,请阅读此处: http ://www.gnu.org/software/libc/manual/html_node/Registering-New-Conversions.html#Registering-New-Conversions和此处:http://www.gnu。 org/software/libc/manual/html_node/Defining-the-Output-Handler.html#Defining-the-Output-Handler

一个例子可以在这里找到:http ://www.gnu.org/software/libc/manual/html_node/Printf-Extension-Example.html#Printf-Extension-Example

于 2012-12-11T14:50:46.877 回答
0

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

于 2012-12-11T14:43:22.887 回答
0

C 没有提供自动执行此操作的方法。

当然,您可以编写自己的print_struct_person函数,但是您必须为要打印的每个函数编写一个函数。

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

于 2012-12-11T14:43:35.447 回答
0

试试这个:

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;
}
于 2012-12-11T14:47:55.277 回答