뇌 마음 반반저장소

[42_GNL] 코딩하기 본문

42/get_next_line

[42_GNL] 코딩하기

맹진저 2022. 12. 22. 21:45
728x90

[42_GNL] 구조 파헤치기

 

[42_GNL] 구조 파헤치기

일단 겟넥라(?)의 흐름을 알고 가보자. 처음에 이 흐름이 안 들어와서 정말 힘들었다. 일단 메인과 GNL의 상관관계를 파악하고 넘어가자. GNL은 함수 안에서 계산하고 내보낼 수 없는 기능이다. (GNL

sudo-me.tistory.com

이제 구조를 디자인했으니 코딩을 해보자. 

 

1. 전체 문자열을 버퍼에 저장한다.

 - fd의 문자열을 저장할 수 있는 buffer_size의 지역변수를 만든다. 

 - buffer_size 만큼의 영역을 malloc으로 buf에 저장한다. 

 - read로 문자열을 불러온다.

 - 메인함수에 있는 static변수인 save와 buf 두 문자열을 strjoin으로 붙여 save에 저장한다. 

 - buf는 문자열을 free로 해제하고 save를 반환한다.


2.'\n'을 찾아 그 앞까지 저장한다.

 - save를 불러와 \n이 나오기 전까지 루프를 돌려 단어의 개수를 알아낸다.

 - 프린트될 라인 new_line을 malloc으로 (단어의 개수 + \n + \0)의 공간을 만들어 준다.

 - 그리고 새로운 라인에 \n전까지 저장해 주고

 - \n를 따로 저장해 주고

 - \0를 저장한 뒤 반환한다.


3.'\n'뒤에서부터 끝까지 다시 다 저장한다. 

 - save를 불러와 \n이 나올 때까지 루프를 돌려준다. 

 - malloc으로 (전체 길이 - 루프 문자의 길이 + \0)의 공간을 만들어준다.

 - 새로 저장할 문자열 new_save에 \n이후의 문자열을 착착 저장해 준다. 

 - 다 쓴 save는 free 해준다.

 - new_save를 반환해 준다.

 

4.new_line을 리턴한다.

 

가장 애를 먹었던 게 strjoin을 다시 구현하는 것이었다. s1 문자열이 '\0'로 들어올 때가 있는데 그 예외처리를 해주지 않으면 시작도 안 한다. (왜냐하면 처음 save는 텅 비어있기 때문..!)

728x90

'42 > get_next_line' 카테고리의 다른 글

[42_GNL] 구조 파헤치기  (0) 2022.12.20
[42_GNL] get_next_line 개념 이해하기 (open, read, 버퍼사이즈)  (0) 2022.12.19
[42_GNL] 시작하며  (0) 2022.12.18
Comments