2012-12-11 7 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 : * non portable * 솔루션 (GNU의'glibc' 사용)에 대해서는 제 대답을 참조하십시오. – alk

답변

1

(GNU libc의를 따라서 만 사용할 수 gcc를 사용하는 경우, 그리고 portbale 아니지만) :

#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("[%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

당신이 메타 프로그래밍 및 특성을 사용할 수 있도록 langages 내에서 하나의 printf 문에서 여러 형식 지정자를 사용할 수 있습니다, 당신은 그렇게하지만 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); 

포인터 방식을 사용하면 전체 구조를 인수로 복사하지 않아도됩니다. 하지만이 간단한 구조체로 간단하게 유지하는 것이 좋습니다. 매크로 방법 : "정의하고 등록하는 것이 가능 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; 
} 
0

이 시도 새로운 "변환 지정자가 의 printf 기능 구현과 함께 사용되며 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

관련 문제