2020. 4. 25.

[자료구조] 인프런 4. 전화번호부 v1.0(1) 강의 정리


전화번호부 프로그램을 만든다.

add 전화번호를 추가
find 전화번호를 검색
status 전화번호에 저장된 모든 사람의 정보 출력
delete 전화번호부에서 삭제
exit 프로그램 종료

*실행


*자료구조


보통은 자료구조를 먼저 생각하고 코드를 짜기 시작한다.
전화번호의 앞자리가 0일수있으므로 전화번호를 문자로 다루는게 낫다.

*strdup 필요한 이유


buf1은 스택에 할당된 메모리이므로 add 함수가 return되고 나면 소멸된다.
따라서 buf1에 저장된 문자열을 복제한 후 배열 names[0]에 복제된 배열의 주소를 저장해야 한다. 복제된 배열은 strdup 함수 내에서 maaloc으로 (heap) 할당된 메모리이므로 add 함수가 종료된 후에도 소멸하지 않는다.

*c언어에서 메모리 관리

전역변수(global variable)
  • 함수의 외부에 선언된 변수들
  • 프로그램이 시작될 메모리가 할당되며 프로그램이 종료될 때까지 유지된다.
  • Data section이라고 부르는 메모리 영역에 위치한다.

지역변수(local variable)
  • 함수의 내부에 선언된 변수들
  • 자신이 속한 함수가 호출될 메모리가 할당되며 함수가 return 소멸된다.
  • 스택(stack)이라고 부르는 영역에 위차한다.

동적 메모리 할당(dynamic memory allocation)
  • 아무때나 malloc등의 함수를 호출하여 필요한 크기의 메모리를 할당할 있다. 이것을 동적 메모리 할당이라고 부른다.
  • 동적으로 할당된 메모리는 (heap)이라고 부르는 영역에 위치한다.
  • 동적으로 할당된 메모리는 명시적으로 free()함수를 호출하여 반환하지 않는한 계속 유지된다.

*c 언어에서 메모리 레이아웃


code : 코드섹션, 코드를 컴파일한 기계어, 코드가 저장되는 공간
data section, code 늘어나긴해도 없어지거나 줄어들지 않음
stack heap 늘엇다가 줄엇다 한다.
힙과 스택은 반대방향으로 설정해둔다.

#include
#include
//strcmp 사용


#define CAPACITY 100
// 최대 100명을 저장한다.
#define BUFFER_SIZE 20

char * names[CAPACITY ] // namses
//names numbers char*타입의 배열이다.
char * numbers[CAPACITY]; //phone numbers
int n=0; //number of people in phone directory

void add();
void find();
void status();
void remove();

int main() {
char command[BUFFER_SIZE];
while(1){
printf("$ ");
// 프롬프트에 출력을 한다.
scanf("%s", command);
                 // 입력을 받아 command라는 배열에 저장한다.

if(strcmp(command, "add")==0)
// strcmp함수는 두 문자열이 동일하면 0을 반환한다.
add();
else if(strcmp(command, "find")==0)
// find를 입력하면 find
find();
else if(strcmp(command, "status")==0)
status();
else if(strcmp(command, "delete")==0)
remove();
else if(strcmp(command, "exit")==0)
break;
//exit를 입력하면 while문을 빠져나간다.
}
return 0;



}        

void add() {
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];
scanf("%s", buf1);
// 이름
scanf("%s", buf2);
// 전화번호

names[n] = strdup(buf1);
// n 번째 칸은 저장된 사람 수
// 사람이름 저장
numbers[n] = strdup(buf2);
// n 번째 칸에 전화번호 저장
// strdup 는 새로운 곳에 복사하여 넣고 주소를 리턴한다.
// strcpy 새로운 변수에 넣어준다.        

n++;

printf("%s was added successfully. \n", buf1);
}

void find(){

}

댓글 없음:

댓글 쓰기