구조체안의 멤버를 처리 해본다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

struct tagAddress
{
	char name[6];		// 이름
	char phone[20];		// 전화
	char address[72+1];	// 주소
	char detail[200];	// 디테일
};

void main(void)
{
	struct tagAddress ad1; //일반 구조체변수 선언
	struct tagAddress* pad1; //포인터 구조체변수 선언
	//포인터 구조체를 선언하면 일반 구조체변수를 포인터 구조체에 저장 해야한다.
	pad1 = &ad1;

	struct tagAddress ad2; //일반 구조체변수 선언
	struct tagAddress* pad2; //포인터 구조체변수 선언
	//포인터 구조체를 선언하면 일반 구조체변수를 포인터 구조체에 저장 해야한다.
	pad2 = &ad2;

	struct tagAddress ad3; //일반 구조체변수 선언
	struct tagAddress* pad3; //포인터 구조체변수 선언
	//포인터 구조체를 선언하면 일반 구조체변수를 포인터 구조체에 저장 해야한다.
	pad3 = &ad3;

	//구조체에 각각 값넣기
	strcpy(ad1.name, "name1");
	strcpy(ad1.phone, "phoneNumber1");
	strcpy(ad1.address, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa72");

	strcpy(ad2.name, "name2");
	strcpy(ad2.phone, "phoneNumber2");
	strcpy(ad2.address, "abcdefghijklmbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb22");

	strcpy(ad3.name, "name3");
	strcpy(ad3.phone, "phoneNumber3");
	strcpy(ad3.address, "abcdefghijklmcccccccccccccccccccccccccccccccccccccccc33");
	strcpy(ad3.detail, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa72_sssdddsd__");

	printf("이름1 : %s \n", ad1.name);
	printf("전화1 : %s \n", ad1.phone);
	printf("주소1 : %s \n\n", ad1.address);

	printf("이름2 : %s \n", ad2.name);
	printf("전화2 : %s \n", ad2.phone);
	printf("주소2 : %s \n", ad2.address);

	printf("이름3 : %s \n", ad3.name);
	printf("전화3 : %s \n", ad3.phone);
	printf("주소3 : %s \n\n", ad3.address);
	printf("디테일3 : %s \n", ad3.detail);

	//2구조체의 이름을 1에 복사
	//(*pad1).name = &pad2 -> name;
	
	//첫번째 네임의 1열부분에 두번째 네임 복사.
	//memcpy(&ad1.name[1], pad2->name, sizeof(ad1.name)-1);

	//100열에 해당하는 어드레스를 5열 네임에 해당하는 5바이트로 짤라서 네임에 저장
	//memcpy(ad1.name, ad2.address, sizeof(ad1.name)-1);  //스트링의 마지막은 0이어야 하므로 마지막 0을 제외한것을 잘라줘야함
	//memcpy(pad1->name, pad2->address, sizeof(ad1.name) - 1);
	
	//strncpy(ad1.name, ad2.address, sizeof(ad1.name)-1); //배열 마지막에 0이 들어가야하므로 -1

	//아드레스2의 5열부터 복사해서 디테일3에 저장. 즉 아드레스2열의 0~4열까진 버림 // +1은 1부터시작이고 [1]는 0부터시작임 즉 +156은 앞에 156자리수를 버리고 157부터 처리
	//memcpy(pad3->detail, pad2->address+5, sizeof(ad2.address));

	/********중요*************/
	// 헤더와 전문이 같이 있는 디테일3을 앞에 72자리를 자른 뒤73바이트 길이를 가진 아드레스1에 넣는다.
	//memcpy(pad1->address+0, pad3->detail + 72, sizeof(ad1.address)); //+로 쓰는 문장
	//memcpy(pad1->address, &ad3.detail[72], sizeof(ad1.address)); //배열로 쓰는 문장
	//memcpy(ad1.address, &ad3.detail[72], sizeof(ad1.address)); //0번배열부터 쓴다면 [0]은 생략해도 된다
	//memcpy(&ad1.address, &ad3.detail+72, sizeof(ad1.address)); 
	
	//포인터 꺽쇠는 가르키는 것이라 +로만 써야한다. 배열로 쓰려면


	//printf("사이즈 sizeof(ad1.name) : %d \n", sizeof(ad1.name));
	printf("\n======포인터 구조체 적용====\n\n");


	printf("이름1 : %s \n", ad1.name);
	printf("전화1 : %s \n", ad1.phone);
	printf("주소1 : %s \n", ad1.address);

	printf("이름2 : %s \n", ad2.name);
	printf("전화2 : %s \n", ad2.phone);
	printf("주소2 : %s \n", ad2.address);

	printf("이름3 : %s \n", ad3.name);
	printf("전화3 : %s \n", ad3.phone);
	printf("주소3 : %s \n\n", ad3.address);
	printf("디테일3 : %s \n", ad3.detail);

	//값 입력
	//strcpy((*pad1).name, "홍길2");
	//strcpy((*pad1).phone, "02-1234-5672");
	//strcpy((*pad1).address, "서울시 양천구 목동아파트 2단지");

	//printf("이름 : %s \n", pad->name);
	//printf("전화 : %s \n", pad->phone);
	//printf("주소 : %s \n", pad->address);
}

 

 

'C언어' 카테고리의 다른 글

select 함수  (0) 2023.03.10
4. 구조체를 함수에서 사용하기  (0) 2022.08.15
3. 구조체 포인터  (0) 2022.08.15
2. 문자포인터와 정수 포인터  (0) 2022.08.15
1. C언어 콘솔 찍기  (0) 2022.05.31

+ Recent posts