배열 재할당, 라인단위 입력과 문자열 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;
// 실제로
읽은 문자수를 반환한다.
}
댓글 없음:
댓글 쓰기