Born to Code
42서울 본과정
토글이 없어 보기 힘듭니다.
노션과 깃 페이지를 남겨두니 참고하세요.
mandatory part와 bonus part 코드가 같음.
read함수를 최대한 적게 사용
하는 방안으로 모색하였다.원상복구하는 방향
으로 하였다.\n
확인.해당 문자열을 조작하고 1 반환
.read함수
를 사용하여 BUFFER_SIZE
만큼 읽어오기strjoin
을 사용하여 저장.\n
이 있는지 확인.해당 문자열을 조작하고 1 반환
.EOF
를 만나면, 저장되어 있는 문자열 확인 후 1 반환.util 함수
들을 사용char *ft_strndup(const char *s1, size_t n)
char *ft_strjoin(char const *s1, char const *s2)
static char *storage[OPEN_MAX]
OPEN_MAX
는 limit.h
에서 가져옴. (컴파일러, os마다 값이 다르기 때문)구현방법은 정말 여러가지입니다. 참고용으로만 보시길 바랍니다.
코드참고
int get_next_line(int fd, char **line)
{
static char *storage[OPEN_MAX];
char str_buffer[BUFFER_SIZE + 1];
size_t read_size;
int return_val;
if (read(fd, str_buffer, 0) == -1 || !line || BUFFER_SIZE <= 0)
return (-1);
if (ft_strchr(storage[fd], '\n'))
return (cut_new_line(&storage[fd], line));
while ((read_size = read(fd, str_buffer, BUFFER_SIZE)) > 0)
{
str_buffer[read_size] = 0;
storage[fd] = ft_strjoin(storage[fd], str_buffer);
if (ft_strchr(storage[fd], '\n'))
return (cut_new_line(&storage[fd], line));
}
return_val = cut_new_line(&storage[fd], line);
if (return_val == 1)
return (0);
return (return_val);
}
if (read(fd, str_buffer, 0) == -1 || !line || BUFFER_SIZE <= 0)
if (ft_strchr(storage[fd], '\n'))
{ return (cut_new_line(&storage[fd], line)); }
str_buffer[read_size] = 0;
storage[fd] = ft_strjoin(storage[fd], str_buffer);
return_val = cut_new_line(&storage[fd], line);
if (return_val == 1)
return (0);
while문에서 탈출
했다는 것은, read함수가 EOF를 만났고
, 저장된 문자열에 \n이 없음
을 의미함.코드참고
static int cut_new_line(char **buf, char **line)
{
char *patrol;
char *temp;
if (!buf || !*buf)
{
*line = ft_strndup("", 0);
return ((*line != 0) ? 0 : -1);
}
patrol = ft_strchr(*buf, '\n');
if (!patrol)
{
*line = *buf;
*buf = 0;
return (1);
}
if (!(*line = ft_strndup(*buf, patrol - *buf)))
return (-1);
if (!(temp = ft_strndup(patrol + 1, ft_strlen(patrol + 1))))
{
free(*line);
return (-1);
}
free(*buf);
*buf = temp;
return (1);
}
patrol = ft_strchr(*buf, '\n')
if (!patrol)
{
*line = *buf;
*buf = 0;
return (1);
}
patrol 변수
는 buf 문자열에서 개행을 찾는 변수임.null
이라는 뜻은, 해당 문자열에 널이 없다는 것을 의미함.cut_new_line
함수는 read함수가 EOF를 만나지 않는 이상 \n이 있을 때만 함수가 호출
됨, 즉 현재 EOF를 만났고, 문자열에 \n이 없다는 뜻
이 됨.buf문자열 전부를 line
에 넣어주고, buf에는 0
을 넣어둠.char *ft_strndup(const char *s1, size_t n)
{
size_t i;
char *ptr;
i = 0;
ptr = malloc(sizeof(char) * (n + 1));
if (!ptr)
return (0);
while (i < n)
{
ptr[i] = s1[i];
i++;
}
ptr[i] = 0;
return (ptr);
}
s1문자열
에서 일부분만 복제하기 위해 n 매개변수를 추가
함.char *ft_strjoin(char const *s1, char const *s2)
{
size_t s1_len;
size_t s2_len;
char *ptr;
if (!s1 && !s2)
return (0);
if (!s1)
return (ft_strndup(s2, ft_strlen(s2)));
else if (!s2)
return (ft_strndup(s1, ft_strlen(s1)));
s1_len = ft_strlen(s1);
s2_len = ft_strlen(s2);
if (!(ptr = (char *)malloc(sizeof(char) * (s1_len + s2_len + 1))))
return (0);
ft_strlcpy(ptr, s1, s1_len + 1);
free((void *)s1);
ft_strlcpy(ptr + s1_len, (char *)s2, s2_len + 1);
return (ptr);
}
get_next_line
함수에서 s1변수에 반환값을 저장하므로, 반환 전 s1의 할당된 메모리를 free
해야 함.