일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 파일읽고쓰기
- vgg
- 배열
- C
- 다차원
- 이미지생성
- 조건문
- 스프링기초
- VGG-S
- springboot
- 시간복잡도
- VGG-M
- C언어로쉽게풀어쓴자료구조
- 김영한
- strdup
- gan
- 백준
- 문자열
- 김영한스프링부트
- 스프링입문
- inflearn
- 다차원배열순회
- 자바
- 웹기초
- Intellij
- ChatGPT
- VGG-F
- 자료구조
- 포인터
- 오븐시계
- Today
- Total
YUIN
자료구조 4 [전화번호부.v1] 본문
1. 실행 예시
- 프로그램을 실행하면 프롬프트($)를 출력하고 사용자의 명령을 기다린다.
- 새로운 사람을 추가한다.
- 이름으로 전화번호를 검색한다.
- 전화번호부에 저장된 모든 사람을 출력한다.
- 전화번호부에서 삭제한다.
- 프로그램을 종료한다.
먼저 names와 numbers에 각각 사용자의 이름과 전화번호를 저장해야 한다. 이때, 각각의 배열에 주소값을 저장해야 하니 char * 변수를 사용해야 한다는 것을 알 수 있다. 전화번호의 경우 int 즉 정수형 변수를 사용해야 하지 않나? 와 같은 생각을 할 수 있는데, 전화번호의 경우 010-0000-0000 와 같이 '-' 기호를 넣는 경우도 있으며 주로 전화번호는 0으로 시작하는데 컴퓨터가 0을 자동적으로 없애고 읽어들이는 경우가 많아서 문자형 변수로 선언하는 것이 바람직하다.
2. phonebook01.c
- #define CAPACITY 100에서 최대 100명을 저장한다.
- names와 numbers는 char * 타입의 배열이다.
- strcmp 함수는 두 문자열이 동일하면 0을 반환한다.
- add 함수에서 사람의 이름을 buf1에, 전화번호를 buf2에 입력받는다.
- strdup와 strdpy의 차이: strdup는 string.h 라이브러리가 제공하므로 직접 구현할 필요는 없다. strdup는 배열을 만들고 매개변수로 받은 하나의 문자열을 거기에 복사하여 반환한다.
char *strdup(char *S)
{
char *p;
p=(char *)malloc(strlen(s)+1);
if(p!=NULL)
strcpy(p,s);
return p;
}
buf1은 스택에 할당된 메모리(=지역변수)이므로 add 함수가 return 되고 나면 소멸된다. 따라서 buf1에 저장된 문자열을 복제한 후 배열 names[0]에 복제된 배열의 주소를 저장해야 한다. 복제된 배열은 strdup 함수 내에서 malloc으로 (heap에) 할당된 메모리이므로 add 함수가 종료된 이후에도 소멸되지 않는다.
buf1과 buf2는 add (아래에 코드를 공개할 예정이다)함수 내에서 선언된 지역변수로, 지역변수의 생명주기(lifetime)는 자신이 속한 함수가 선언될 때 생성되고, 그 함수가 끝나는 순간 사라지므로 strdup이 아닌 strcpy등을 활용하여 buf1이나 buf2를 사용하게 되면, 함수가 호출되고 활성화돼있는 동안에는 buf1과 buf2에 저장된 데이터들을 자유롭게 사용하는 것이 가능하지만, 함수가 종료되는 순간 buf1과 buf2라는 배열이 사라지게 되므로, 그 안에 있는 데이터들 역시 소멸된다.
void add() {
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];
scanf("%s", buf1);
scanf("%s", buf2);
names[n] = strdup(buf1);
numbers[n] = strdup(buf2);
n++;
printf("%s was added successfully.\n", buf1);
}
이때 names와 numbers 배열은 메인함수가 돌아가는데 항상 살아있어야 하는 (=필요한) 배열이므로, 데이터가 사라지는 일이 없어야 한다. 따라서 strdup(동적메모리를 할당해서 복사)함수를 사용하는 것이다.
3. C언어에서 메모리 관리
- 전역변수 (global variable)
: 1) 함수의 외부에 선언된 변수.
2) 프로그램이 시작될 때 메모리가 할당되며 프로그램이 종료될 때까지 유지된다.
3) Data Section이라고 부르는 메모리 영역에 위치한다.
- 지역변수 (local variable)
: 1) 함수의 내부에 선언된 변수들.
2) 자신이 속한 함수가 호출될 때 메모리가 할당되며 함수가 return될 때 소멸된다.
3) 스택(stack)이라고 부르는 영역에 위치한다.
- 동적 메모리 할당 (dynamic memory allocation)
: 1) 아무때나 malloc 등의 함수를 호출하여 필요한 크기의 메모리를 할당할 수 있다. 이것을 동적 메모리 할당이라고 부른다.
2) 동적으로 할당된 메모리는 힙(heap)이라고 부르는 영역에 위치한다.
3) 동적으로 할당된 메모리는 명시적으로 free()함수를 호출하여 반환하지 않는 한 계속 유지된다.
4. 코드
#include <stdio.h>
#include <string.h>
#define CAPACITY 100
#define BUFFER_SIZE 20
char* names[CAPACITY]; //names
char* numbers[CAPACITY]; //phone numbers
int n = 0; // number of people in phone directory
void add();
void find();
void status();
void erase();
int main() {
char command[BUFFER_SIZE];
while (1) {
printf("$ ");
scanf("%s", command);
if (strcmp(command, "add") == 0)
add();
else if (strcmp(command, "find") == 0)
find();
else if (strcmp(command, "status") == 0)
status();
else if (strcmp(command, "delete") == 0)
erase();
else if (strcmp(command, "exit") == 0)
break;
}
return 0;
}
void add() {
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];
scanf("%s", buf1);
scanf("%s", buf2);
names[n] = strdup(buf1);
numbers[n] = strdup(buf2);
n++;
printf("%s was added successfully.\n", buf1);
}
void find() {
char buf[BUFFER_SIZE];
scanf("%s", buf);
int i;
for (i = 0; i < n; i++) {
if (strcmp(buf, names[i]) == 0) {
printf("%s\n", numbers[i]);
return;
}
}
printf("No person named %s exists.\n", buf);
}
void status() {
int i;
for (i = 0; i < n; i++)
printf("%s %s\n", names[i], numbers[i]);
printf("Total %d persons.\n",n);
}
void erase() {
char buf[BUFFER_SIZE];
scanf("%s", buf);
int i;
for (i = 0; i < n; i++) {
if (strcmp(buf, names[i]) == 0) {
names[i] = names[n - 1];
numbers[i] = numbers[n - 1];
n--;
printf("'%s' was deleted successfully. \n", buf);
return;
}
}
printf("No person named '%s' exists.\n", buf);
}
'자료구조' 카테고리의 다른 글
C 언어로 쉽게 풀어 쓴 자료구조 1장 자료구조와 알고리즘 (4) | 2023.12.26 |
---|---|
자료구조 5 [전화번호부.v2] (0) | 2023.08.22 |
자료구조 3 [문자열 예제] (0) | 2023.08.08 |
자료구조 2 [문자열] (0) | 2023.08.03 |
자료구조 1 [배열, 포인터, 문자열, 동적메모리할당] (0) | 2023.07.31 |