[42Seoul] exam_rank_02 GNL pseudo 코딩

hyeonze·2021년 3월 26일
0

42Seoul

목록 보기
5/9

Git repository

I. get_next_line 함수

int get_next_line(char **line);

0.선언 : read할 변수, 버퍼, 정적변수
1.매개변수가 없으면 -1반환(에러처리)
2.개행 또는 파일끝 만날 때 까지 읽어서 정적변수에 담기
3."line"에 정적변수에 담은 내용 저장(개행 있으면 개행 앞까지만)
4.개행 후 내용 정적변수에 백업
5.파일 끝이면 0, 아니면 1반환

int get_next_line(char **line)
{

선언 :
int count;(read반환값)
char buf[2];(버퍼)
static char remains;(백업)

count 1로 초기화;
매개변수 line이 없을 경우 -1반환;
while (count가 0아니고 buf[0]가 개행 아니면 반복)
{
    count = read(0, buf, 1)하고 count값이 -1이면 -1반환;
    buf마지막 자리 '\0'로 채우기;
    remains에 buf이어붙이기(ft_strjoin);
}
line에 remains저장하기(push_line, 개행이 포함돼있다면 개행 앞 까지만);
remains에 개행 후 내용이 있다면 개행 후 내용만 저장, 없으면 비우기(cut_next_line);
count가 0이면 0반환, 아니면 1반환;

}

II. push_line 함수

char *push_line(char *remains);

0.선언 : 인덱스, 반환할 포인터
1.인덱스 초기화 후 remains의 끝이나 개행까지 인덱스 밀기
2.반환할 포인터에 메모리 할당('\0' 감안해서 +1 바이트)
3.인덱스 다시 초기화 후 remains의 값 할당한 포인터의 값에 넣기(끝 또는 개행까지)
4.마지막자리 '\0'저장 후 반환

char *push_line(char *remains);
{

선언 : 
int i;(인덱스)
char *arr;(반환값)

i 0으로 초기화;
while (remains[i]의 값이 존재하고 '\0'이 아니면 반복)
	i 증가;
arr에 i+1 바이트의 메모리 할당;
	할당 실패 시 NULL반환;
i 에 0저장;
while (remains[i]의 값이 존재하고 '\0'이 아니면 반복)
{
	arr[i]에 reamins[i]저장;
    i 증가;
}
마지막자리(arr[i]) '\0'저장;
arr 반환;

}

III. cut_next_line 함수

char *cut_next_line(char *remains);

0.선언 : 인덱스1, 인덱스2, 반환할 포인터
1.인덱스 초기화 후 remains[i]가 '\0'이거나 '\n' 일 때까지 인덱스1 밀기
2.remains[i]가 '\0'이면 remains해제 후 NULL반환
3.반환할 포인터에 남은 자릿수+1만큼의 메모리 할당
4.남은문자열 반환할 포인터에 저장 후 끝자리'\0'저장
5.remains해제 후 반환

char *cut_next_line(char *remains);
{

선언 :
int i;(인덱스1)
int j;(인덱스2)
char *arr;(반환할 포인터)

i, j 초기화;
remains 끝 또는 개행까지 i밀기;
if (remains[i]가 '\0'이면)
{
	remains해제;
    	NULL반환;
}
arr에 남은 자릿수만큼 메모리 할당;
	할당 실패시 NULL반환;
remains[i]끝날 때 까지 arr[j]에 복사;
arr[j]에 '\0'저장;
remains해제;
arr반환;

}

IV.ft_strjoin 함수

char ❋ft_strjoin(char ❋remains, char ❋buf);

0.선언 : 인덱스1, 인덱스2, 문자열크기, 반환할포인터
1. remains and buf 없으면 NULL반환
2. ft_strlen두 번해서 더한걸로 문자열크기 저장
3. 포인터에 문자열크기+1 만큼 malloc
4. 두 문자열 내용 반환할포인터에 이어서 집어넣고 '\0'마감
5. remains해제 후 반환
주의할 점 : remains가 존재하지 않을 경우 buf만 넣어서 처리하기, remains해제하기

char ❋ft_strjoin(char ❋remains, char ❋buf)
{

	선언 :
    	int i;(인덱스1)
        int j;(인덱스2)
        int size;(문자열크기)
        char *arr;(반환할포인터)
        
        remains, buf 둘다 존재하지 않으면 NULL반환;
        size에 ft_strlen(remains)+ft_strlen(buf)저장;
        arr에 size+1 만큼 메모리할당, 실팻 시 NULL반환;
        인덱스들 초기화;
        remains가 존재한다면remains의 문자열 arr에 차례로 저장;
        arr뒷 자리에 buf 이어서 저장;
        arr마지막자리 '\0'마감;
        remains해제;
        arr반환;

}

V.테스트용 메인문

#include "get_next_line.h"
#include <stdio.h>

int     main(void)
{
    int     r;
    char    *line;

    while ((r = get_next_line(&line)) > 0)
    {
        printf("%s\n", line);
        free(line);
    }
    printf("%s\n", line);
    free(line);
    return(0);
}

VI.make sure

line없을 경우 -1반환
malloc 후 free(특히 cut_next_line에서 NULL반환 할 때)
문자열끼리 복사할 때 전후관계 및 인덱스 잘보기(틀리면 디버깅 어려움)

profile
Advanced thinking should be put into advanced code.

0개의 댓글