본문 바로가기
C Programming

[C]구조체 사용하기

by TYB 2023. 10. 14.
반응형
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NUMBER 10
//구조체를 정적 메모리 할당 후 사용자로부터 자료를 입력 받아 프린트 하는 program을 작성한다.
//구조체 포인터 활용 

typedef struct _person{
	char name[20];
	int age;
	char address[40];
}t_person;	//위에 struct _person을 t_person으로 재정의하는거임 재정의한다고해서 보통 t_를 붙여줌 

void print_person(t_person *p, int *n);
void copy_person(t_person *p, t_person *p1 ,int *n);


int main(void)
{
	t_person p1[NUMBER];
	//위에 구조체랑 이름이 같아도 구조체 내부는 블록으로 봄-> 충돌 X 
	t_person temp;
	
	int i=0;
	
	while(1)
	{
		printf("Enrer name age address (exit: end 0 end) ");
		scanf("%s",&temp.name);
		scanf("%d",&temp.age);
		scanf("%s",&temp.address);
		
		if(!strncmp(temp.name,"end",strlen("end")))//strncmp 값이 같으면 null을 리턴받음 
		{
			break;
		}
		else
		{
			copy_person(&p1,&temp,&i);
		}
		
	}
	print_person(&p1,&i);
	
}

void print_person(t_person *p, int *n)
{
	int i;
	t_person *pt=p;// 항상 포인터 조작할때는 새로 만들어서 덮어씌운걸로 조작 
	if(*n==0){
		printf("n이 0이네?\n");
	}
	else
	{
		printf("이름 나이 주소\n");
		printf("=== ==== =======================\n");
		for(i=0; i<*n;i++)
		{
			//printf("%-6s %d    %s\n",*(pt).name,*(pt).age,*(pt).address);
			printf("%-6s %d    %s\n",pt->name,pt->age,pt->address);//통상 구조체 포인터 멤버 편수를 표현할때에는 이렇게 표현함 
			pt++; 
		}
		printf("====================================\n");
	}

	
}

void copy_person(t_person *p, t_person *p1 ,int *n)
{
	t_person *pt=p+*n;// 항상 포인터 조작할때는 새로 만들어서 덮어씌운걸로 조작
					  // 위 처럼 하든지 main문 안에서 copy_person(&p1,&temp,&i);를 하든지 
	strncpy(pt->name,p1->name,strlen(p1->name)); //strcpy(pt->name,tp1->name)도 가능 
	pt->age=p1->age;
	strncpy(pt->address,p1->address,strlen(p1->address));
	*n+=1;
}
반응형