#ifndef __NAME_CARD_H__
#define __NAME_CARD_H__

#define NAME_LEN		30
#define PHONE_LEN		30

typedef struct __namecard
{
	char name[NAME_LEN];
	char phone[PHONE_LEN];
} NameCard;

// NameCard 구조체 변수의 동적 할당 및 초기화 후 주소 값 반환
NameCard * MakeNameCard(char * name, char * phone);
   
// NameCard 구조체 변수의 정보 출력
void ShowNameCardInfo(NameCard * pcard);
   
// 이름이 같으면 0, 다르면 0이 아닌 값 반환
int NameCompare(NameCard * pcard, char * name);
   
// 전화번호 정보를 변경
void ChangePhoneNum(NameCard * pcard, char * phone);

#endif

만들어야 하는 파일의 헤더다.

#include <stdio.h>
#include <stdlib.h>
#include "my_NameCard.h"

NameCard* MakeNameCard(char* name, char* phone) // NameCard 구조체 변수의 동적 할당 및 초기화 후 주소 값 반환
{
	NameCard* PtemName;

	(NameCard*)PtemName = (NameCard*)malloc((sizeof(char) * NAME_LEN) + (sizeof(char) * PHONE_LEN));
	if (PtemName == NULL)
	{
		printf("MemAollc Failed");
		exit(1);
	}
	
	for (int i = 0; i < NAME_LEN; i++)
	{
		PtemName->name[i] = name[i];
	}
	for (int i = 0; i < PHONE_LEN; i++)
	{
		PtemName->phone[i] = phone[i];
	}
	
	return PtemName;
}

void ShowNameCardInfo(NameCard* pcard) // NameCard 구조체 변수의 정보 출력
{
	fputs(pcard->name, stdout);
	printf("\\n");
	fputs(pcard->phone, stdout);
	printf("\\n\\n");
}

int NameCompare(NameCard* pcard, char* name)// 이름이 같으면 0, 다르면 0이 아닌 값 반환
{ 
	for(int i = 0; i < NAME_LEN; i++)
	{
		if (pcard->name[i] != name[i])
			return 1;
	}
	return 0;
}

void ChangePhoneNum(NameCard* pcard, char* phone)// 전화번호 정보를 변경
{
	for (int i = 0; i < PHONE_LEN; i++)
	{
		pcard->phone[i] = phone[i];
	}
	
}

해결했다.

의아했던건…

Untitled

main.c에서 저부분을 실행하려고 하면 계속 오류가 났었음.

내 생각대로라면 잘못한게 없는데… 뭘 잘못할만큼 my_NameCard.c 가 어려운 구조도 아니다.

가능한 경우는

  1. LRemove(&list)가 제대로 된 구조체포인터를 반납하지 않거나
  2. 혹은 애초부터 동적할당이 이상하게 된 것..?

하나하나 찾아보니 1과 2모두 문제였다.

문제는 강의에서 제공한 답지가 틀렸다는 것임.

저번 강의에서

LData LRemove(List* plist)
{
	int rpos = plist->curPosition;
	int num = plist->numOfData;
	int i;
	LData rdata = plist->arr[rpos]; // 삭제할 데이터 임시저장

	**for (i = rpos; i < num-1; i++)**
	{
		plist->arr[i] = plist->arr[i + 1];

		(plist->numOfData)--;
		(plist->curPosition)--;
		return rdata; // 삭제된 데이터 반환
	}
}

볼드처리한 부분을 보자. 저게 왜 문제냐면

지금처럼 num = 3이고, rpos=2인경우에는

2번째 인덱스를 삭제하고, 3번째 인덱스를 2번째 인덱스 자리에 넣어야 하는데 조건에 맞지 않아서 애초에 for문에 진입하지 않는다.