C 언어 프로젝트를 하면서 어떤 저장된 파일을 불러올 경우 주의할 점이다.
Kim#He was idiot#C:\\Document
Tim#He was not#D:\\File
Tina#She was pretty#C:\\Picture
이렇게 되어 있었던 경우라고 하고 #을 기준으로 tokenizing을 한다고 가정한다.
1 2 3 4 5 6 7 8 9 10 11 12 | void load(FILE *fp) { char buffer[BUFFER_LENGTH]; char *name, *title, *path, *context; while (1) { if (read_line(stdin, buffer, BUFFER_LENGTH) <= 0) break; name = strtok_s(buffer, "#", &context); title = strtok_s(NULL, "#", &context); path = strtok_s(NULL, "#", &context); } } | cs |
이렇게 하면?? 큰일난다. 왤까... 모범 답안을 보면 이해가 갈 것이다.
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 | void load(FILE *fp) { char buffer[BUFFER_LENGTH]; char *name, *title, *path, *context; while (1) { if (read_line(fp, buffer, BUFFER_LENGTH) <= 0) break; name = strtok_s(buffer, "#", &context); if (strcmp(name, " ") == 0) name = NULL; else name = _strdup(name); title = strtok_s(NULL, "#", &context); if (strcmp(title, " ") == 0) title = NULL; else title = _strdup(title); path = strtok_s(NULL, "#", &context); if (strcmp(path, " ") == 0) path = NULL; else path = _strdup(path); printf("%s %s %s\n", name, title, path); } } | cs |
while문을 계속 돌기 때문에, char *name, *title, *path 이 친구들이 계속해서 쓰이게 될 것이고, 이 변수들이 배열 포인터이기 때문에 그 값이 계속해서 바뀌게 된다. 그래서 매번 while문을 돌 때마다 strdup를 이용해서 복사를 해 주어야 한다.
'공부' 카테고리의 다른 글
C 언어 - linked list search 예제 (0) | 2019.02.04 |
---|---|
C 언어 - linked list에서 node를 추가할 때 예외처리 (0) | 2019.02.04 |
C 언어 형 변환(캐스팅)시 주의할 점 (0) | 2019.02.04 |
C 언어 프로젝트 - 하기 전에 주의해야 할 점 (0) | 2019.02.02 |
mbed os - 간단한 프로젝트 (0) | 2019.02.01 |