전화번호부 프로그램을 만든다.
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(){
}
댓글 없음:
댓글 쓰기