2020. 4. 26.

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


배열 재할당, 라인단위 입력과 문자열 tokenizing

*실행

저장된 사람의 수가 배열의 용량을 초과할 경우 동적 메모리 할당으로 배열의 크기를 키운다.
명령어를 잘못 입력했을경우 대응


*라인단위로 처리할 핵심함수


line단위의 입력은 fgets, getline 등의 함수들을 이용하여 수도 있다.

*문자열 tokenizing( 분석 )

구분 문자(delimiter) 이용하여 하나의 문자열을 작은 문자열들로 자르는 일을 문자열 tokenizing 이라고 부른다. 잘라진 작은 문자열들을 보통 token이라고 부른다.

c언어에서는 주로 strtok 함수를 이용한다.

#include
#include
#include

#define INIT_CAPACITY 3
// 배열 재할당을 테스트하기 위해서 일부러 아주 작은 값으로
#define BUFFER_SIZE 50

char** names;
char** numbers;
// char * 타입의 배열의 이름으로 char**타입의 변수이다.
// 동적메모리 할당으로 크기를 키우려면 포인터로 선언해야한다.

int capacity = INIT_CAPACITY;
//size of arrays;
int n = 0;
// number of people in phone directory

// function prototypes here
void init_dierctory();

char delim[] = " ";

int main() {
init_dierctory();
// 이 함수에서 배열 name numbers를 생성한다.
process_command();
// 사용자의 명령을 받아 처리하는 부분을 별개의 함수로 만들었다.

return 0;
}

void init_dierctory() {
names = (char**)malloc(INIT_CAPACITY * sizeof(char*));
numbers = (char**)malloc(INIT_CAPACITY * sizeof(char*));
// 할당할 메모리의 byte수를 지정한다. 직접 숫자로 지정하는 것보다
// 이렇게 sizeof 연산자를 사용하는 것이 바람직하다.
// 배열의 크기가 INIT_CAPACITY이다.
}

int read_line(char str[], int limit)
// limit 보다 더 긴 line의 경우 뒷부분이 짤린다.
//
{
int ch, i = 0;

while ((ch = getchar()) != '\n')
// 줄바꿈 문자가 나올 때까지 읽는다.
// getchar 문자로 입력을 받지만 정수형으로 반환한다.
if (i < limit - 1)
// 배열의 용량을 초과하지 않을 때만 저장한다.
// limit - 1 을 한것은 \0가 들어가야 하는 공간
str[i++] = ch;

str[i] = '\0';
// 마지막에 null character ('\0')를 추가한다.

return i;
// 실제로 읽은 문자수를 반환한다.
}

댓글 없음:

댓글 쓰기