2012-12-11 18 views
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; 
} 
+2

没有办法,而无需访问每个成员的打印。不过,你可以写一个函数来帮助你做到这一点。 – nhahtdh

+0

您也可以编写一个抽象函数,通过传递指向结构的指针和指向结构中成员类型和偏移量的表的指针来为结构类型执行此操作。但除非你真的需要更抽象的版本,否则我会用simonc的答案去做。 –

+0

@nhahtdh:对于非移动*解决方案(使用GNU的'glibc'),请参阅我的答案。 – alk

回答

1

如果使用glibc是可以定义和注册“:宏 方法:

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

PRINTP(p); 
+0

尽管(因为它可能不会立即显而易见),您应该提到这不是可移植的答案。 – nhahtdh

+0

@nhahtdh更新。 – alk

4

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

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

内,让你用元编程和特点语言研究,你可以做,但在C有是没有办法做这样的事情。 simonc答案是几乎每个人都使用的解决方案。

0

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

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

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

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); 

使用指针方法避免了将整个结构作为参数进行复制。 但你可能更喜欢用这些简单的结构来保持简单。 (使用gcc时GNU libc的,因此只可用,虽然不是portbale)

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; 
} 
0

试试这个新的“转换说明符与glibcprintf功能家族的实现一起使用,这些功能能够满足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