본문 바로가기
Language/C++

[C자료구조] 전화번호부1 - 순서에 관계없이 배열로 CRUD구현

by 태옹 2021. 8. 1.

문제. 이미지와 같이 동작하도록 코드를 구현한다.

 

◾ 문제 동작 원리

 

#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

댓글