문제. 이미지와 같이 동작하도록 코드를 구현한다.
◾ 문제 동작 원리
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 100
#define CAPACITY 100 //최대 100명의 정보를 저장
char* names[CAPACITY];
char* numbers[CAPACITY];
int numberOfPeople = 0;
void add();
void find();
void status();
void remove_user();
void add() {
char name[BUFFER_SIZE];
char number[BUFFER_SIZE];
scanf("%s", name);
scanf("%s", number);
names[numberOfPeople] = _strdup(name);
numbers[numberOfPeople] = _strdup(number);
//strcpy(names[numberOfPeople], name);
//strcpy(numbers[numberOfPeople], number);
numberOfPeople++;
printf("%s was deleted successfully.\n", name);
}
void find() {
char name[BUFFER_SIZE];
scanf("%s", name);
for (int i = 0; i < numberOfPeople; i++) {
if (strcmp(name, names[i]) == 0) {
printf("%s\n", numbers[i]);
return;
}
}
printf("No person named '%s' exists.\n", name);
}
void status() {
for (int i = 0; i < numberOfPeople; i++) {
printf("%s %s\n",names[i],numbers[i]);
}
printf("Total %d persons.\n",numberOfPeople);
}
void remove_user() {
char name[BUFFER_SIZE];
scanf("%s", name);
for (int i = 0; i < numberOfPeople; i++) {
if (strcmp(name, names[i]) == 0) {
names[i] = names[numberOfPeople - 1]; //맨 마지막 사람을 삭제된 자리로 옮긴다.
numbers[i] = numbers[numberOfPeople - 1];
numberOfPeople--;
printf("%s was deleted successfully.\n", name);
return;
}
}
printf("No person named '%s' exists.\n", name);
}
void 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)
remove_user();
else if (strcmp(command, "exit") == 0)
break;
}
return 0;
}
◾ strdup를 사용해야하는 이유
◾ 지역변수 name, number는 함수가 종료될 때 같이 소멸이 되기 때문에 name, number를 그대로 전역변수 names, numbers에 치환하는 것이 불가능
◾ 항상 유지되기 위해서는 strdup로 복제본을 만들어서 저장해야함
◾ 복제본은 strdup함수 내에서 malloc으로 (heap에) 할당된 메모리이므로 add함수가 종료된 후에도 유지됨
◾ 메모리 구조
◾ code, data section의 크기는 변하지 않고 heap, stack영역은 프로그램 실행 중에 계속 크기가 변함
'Language > C++' 카테고리의 다른 글
[C자료구조] 문자열 연습 (0) | 2021.07.31 |
---|---|
_CRT_SECURE_NO_WARNINGS 오류 (0) | 2021.03.06 |
[C] 구조체(struct)와 공용체(union) (0) | 2021.02.25 |
댓글