[ 42Seoul ] Libft : [part_2]

dokim·2021년 8월 4일
0

[42Seoul]

목록 보기
2/2
post-thumbnail

libft : [part_2]

  • man을 한번씩 확인하여 설명을 읽고 함수의 원본과 동일한 프로토타입 및 기능을 수행하는 코드 작성 필요
    (sibject에도 그렇게 설명되어 있고, 그냥 찾아서 하다가 매개변수의 자료형, 리턴값 등 재수정하게 된다.)
  • 일일이 찾는 것보다 한 번에 정리된 블로그들을 참고하는 것이 시간 절약이 된다.






🔹 ft_putchar_fd

//#include "libft.h"    
void    ft_putchar_fd(char c, int fd)
  • 문자c 출력 함수

✔️ Description

char c : 출력할 문자
int fd : 출력에 사용할 파일 디스크립터

✔️ Return

  • 없음

✔️ !! Notice

  • void 함수에 return ?

    • open() 함수는 다음과 같이 사용하기 때문에,
      fd=open("data.txt", O_RDONLY) 파일 오픈에 실패하면 file descriptor는 음수값을 갖게 된다. 이 때 '함수의 종결'을 의미하는 return ; 사용한다.
  • 그래서 fd가 음수 인지 확인 필요



🔹 ft_putstr_fd

//#include "libft.h"    
void 	ft_putstr_fd(char *s, int fd);
  • 문자열s 출력 함수

✔️ Description

char *s : 출력할 문자열
int fd : 출력에 사용할 파일 디스크립터

✔️ Return

  • 없음

✔️ !! Notice

-fd가 음수 인지 확인 필요

  • 문자열 s 비어있는 경우 예외처리



🔹 ft_putendl_fd

//#include "libft.h"    
void 	ft_putendl_fd(char *s, int fd);
  • 문자열s 출력하고 줄바꿈하기

✔️ Description

char *s : 출력할 문자열
int fd : 출력에 사용할 파일 디스크립터

✔️ Return

  • 없음

✔️ !! Notice

-fd가 음수 인지 확인 필요

  • 문자열 s 비어있는 경우 예외처리



🔹 ft_putnbr_fd

//#include "libft.h"    
void 	ft_putnbr_fd(int n, int fd);
  • 정수n 출력하기

✔️ Description

int n : 출력할 정수
int fd : 출력에 사용할 파일 디스크립터

✔️ Return

  • 없음

✔️ !! Notice

-fd가 음수 인지 확인 필요

  • 정수를 문자로 바꾸어 출력
  • 정수의 최솟값인 "-2147483648"일 경우 부호를 +로 바꾸면 오버플로우 되기 때문에 예외처리 필요



🔹 ft_itoa

char	*ft_itoa(int n)
  • 정수를 문자열로 변환하여 변환

✔️ Description

  • int n : 문자열로 변환할 정수
  • 뒤어서부터 채우는 함수로 만들었다.

✔️ Return

  • 정수를 문자열로 변환하여 반환
  • 할당 실패시 NULL 반환

✔️ !! Notice



🔹 ft_strjoin

char	*ft_strjoin(char const *s1, char const *s2)
  • 입력받은 두 개의 문자열을 연결한 새로운 문자열을 반환하는 함수

✔️ Description

  • 문자열 s1 과 문자열 s2 , 널 문자를 포함하는 길이를 구해 malloc으로 새 문자열의 공간을 할당하고, 순차적으로 복사하여 넣어줌.
  • char const *s1 : 앞에 올 문자열의 시작 주소
  • char const *s2 : 뒤에 올 문자열의 시작 주소

✔️ Return

  • 새로운 문자열의 시작 주소를 반환함
  • 할당 실패시 NULL 반환
  • s1 이나 s2 가 NULL로 들어오는 경우
    • s1이 NULL인 경우 s2를 새로운 문자열에 복사 후 반환
    • s2이 NULL인 경우 s1를 새로운 문자열에 복사 후 반환

✔️ !! Notice

  • s == 0;s[0] = '\0';의 차이.

    • char * s = "" <- 이건 빈문자열

    • char *s = NULL <- 이건 그냥 s포인터가 가르키는게 없는 것(NULL 인거)

    • s를 리턴 받았을 때,
      전자는 s[0] == '\0' 이라서 문자열의 끝이 바로 검색되고
      후자는 s[0] 값 자체를 보려고하면 세그먼트 폴트가 뜬다.


🔹 ft_substr

char	*ft_substr(char const *s, unsigned int start, size_t len)

/* 사용 방법 */
ft_substr("aaba", 2, 1);  // 결과 : "b"
ft_substr("aaa", -, 0);   // 결과 : 0이 들어간 문자열 ""
ft_substr("aaaa", 6, -);  // 결과 : 0이 들어간 문자열 ""
  • 지정된 문자열을 범위를 새로운 문자열에 복사하여 반환

✔️ Description

char const *s : 하위 문자열을 생성할 문자열의 시작 포인터(주소)
unsigned int start : 하위 문자열의 시작 인덱스
size_t len : 하위 문자열의 최대 길이

✔️ Return

  • 성공 시 할당한 새 문자열의 시작 주소를 반환
  • 할당 실패시 NULL 반환
  • len(s) < start 일때 빈문자열을 반환

✔️ !! Notice



🔹 ft_strtrim

char	*ft_strtrim(const char *s1, const char *set)

/* 사용 방법 */
ft_strtrim("abcdaddbabc", "abc");  // 결과 : "dadd"
ft_strtrim("abcabababc", "abc");   // 결과 : ""
ft_strtrim("dddfgggdd", "abc");    // 결과 : "dddfgggdd"
ft_strtrim("", "abc");  	   // 결과 : NULL

ft_strtrim("ABCCBA", "AB");  	   // 결과 : "CC"
ft_strtrim("ACCBACBA", "abcAB");   // 결과 : "CCBAC"
ft_strtrim("Hello World!", "Hlde");// 결과 : "o World!
  • 문자열 s1 의 처음과 끝에서 set 문자열에 포함되어 있는 문자가 연속적으로 존재할 경우, 문자를 제거해준 새 문자열을 만들어 반환

✔️ Description

  • char const *s1 : 제거될 문자열
  • char const *set : 제거할 참조 문자의 집합
  • 보통 문자열 앞뒤 공백이 있는 문자열에서 공백제거를 위해 사용한다고 함
    • strltrim : 왼쪽 set 제거
    • strrtrim : 오른쪽 set 제거

✔️ Return

  • 성공 시 문자가 제거된 새 문자열을 반환
  • 할당 실패 시 NULL을 반환

✔️ !! Notice

  • 문자열 s1 이 비어있을 때, NULL을 반환
  • 찾을 문자 set 이 비어있을 때, 문자열 s1 을 새로 할당해서 반환
  • 문자열 s1 이 모두 set 에 포함된 문자일 경우, 빈 문자열 ("") 을 할당하여 반환
  • end


🔹 ft_split

char	**ft_split(char const *s, char c)
  • 문자c를 기준으로 문자열s를 분리하여 배열을 만드는 함수

✔️ Description

  • char const *s : 분할할 문자열의 시작 포인터(주소)
  • char c : 구분 문자
  • 문자열 s를 문자 c 기준으로 나눈 개수를 구하여 이중 포인터로 널 문자를 포함한 공간을 할당
  • 문자열 s를 문자 c 기준으로 나눈 개수만큼 반복하면서 나눈 문자열 길이만큼 메모리를 할당
  • 할당 중 할당 오류가 발생하면 앞서 할당해준 모든 메모리를 free 하고 0으로 초기화 해야 한다.
  • 이중 포인터의 마지막에는 반드시 0을 넣어주어야 함.

✔️ Return

  • 분할한 문자열을 담은 이중 포인터를 반환
  • s1 이 비어있을 경우, NULL을 반환

✔️ !! Notice

  • c언어에서 static으로 선언한 함수는 해당 소스파일에서만 사용 가능하다.


🔹 ft_strmapi

char	*ft_strmapi(char const *s, char (*f)(unsigned int, char))
  • 문자열 s의 각 문자에 f함수를 연속적으로 적용시킨 새로운 문자열 반환

✔️ Description

  • s : 처리할 문자열
  • (*f) : 문자열을 처리할 함수
    리턴값
  • s의 길이를 재서 s 길이 + 1만큼 result에 malloc해주고, result의 요소 각각에 (*f)(i, s[i])한 결과를 담은 뒤, 마지막을 null terminating 해준다.

✔️ Return

  • (*f)(i, s[i]) 한 결과들을 포인터 배열에 담아서 반환
  • 할당 실패시 NULL
  • s 이나 *f 가 NULL로 들어오는 경우를 예외로 처리하여 0을 반환

✔️ !! Notice

  • 함수 포인터에 대한 이해 필요


🔹 ft_striteri

void	ft_striteri(char *s, void (*f)(unsigned int, char *))

✔️ Description

  • s : 처리할 문자열
  • (*f) : 문자열을 처리할 함수
  • subject에서 설명은 문자열 s의 첫 주소와 첫 인텍스 값부터 문자열 끝까지 (*f)에 인자값으로 전달하라고 함.

✔️ Return

  • 없음

✔️ !! Notice

  • 함수 포인터에 대한 이해 필요







File Descripter

파일 디스크립터(File Descriptor)란 리눅스 혹은 유닉스 계열의 시스템에서 프로세스(process)가 파일(file)을 다룰 때 사용하는 개념으로, 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값이다. 파일 디스크럽터는 일반적으로 0이 아닌 정수값을 갖는다.

흔히 유닉스 시스템에서 모든 것을 파일이라고 한다. 일반적인 정규파일부터 디렉토리, 소켓, 파이프, 블록 디바이스, 케릭터 디바이스 등 모든 객체들을 파일로 관리한다. 유닉스 시스템에서 프로세스가 이 파일들을 접근할 때 파일 디스크립터라는 개념일 이용한다. 프로세스가 실행 중에 파일을 Open하면 커널은 해당 프로세스의 파일 디스크립터 숫자 중 사용하지 않는 가장 작은 값을 할당해준다. 그 다음 프로세스가 열려있는 파일에 시스템 콜을 이용해서 접근할 때, 파일 디스크립터(FD)값을 이용해서 파일을 지칭할 수 있다.

프로그램이 프로세스로 메모리에서 실행될 때, 기본적으로 할당되는 파일디스크립터는 표준입력(Standard Input), 표준 출력(Standard Output), 표준에러(Standard Error)이며 이들에게 각각 0, 1, 2라는 정수가 할당된다.

-1 : 실패
0 : Standard Input (표준 입력)
1 : Standard Ouput (표준 출력) (화면출력)
2 : Standard Error (표준 에러 출력)
3~ : open함수를 통해 처음 열면 3번부터 fd가 순차적으로 할당

  • Unix 시스템에서 프로세스가 file을 접근할 때(기원)
    Unix에선 시스템의 모든것들을 파일이라고 한다.
    (파일, 디렉톨, 소켓, 파이프 등등 ==> 파일)
  1. unix 에서 프로세스 실행중에 파일을 Open할 경우
  2. 커널은 사용하지 않은 파일 디스크립트 숫자중 가장 작은값을 할당한다.
  3. 프로세스가 Open된 파일을 접근하려 할때 파일 디스크립트 값을 이용해 다시 파일을 저장할 수 있다.
    Perl에서의 파일핸들과 비슷한 개념같다.

참고_1
참고_2
파일열기 open
c언어 파일 입출력
write

static

  • c언어에서 static으로 선언한 함수는 해당 소스파일에서만 사용 가능하다.
  • 동일한 함수명이 다른 파일에 있어도 충돌 없이 작동함
  • 따라서, 외부에서도 호출할 함수 외에는 static함수로 선언하는 것이 유리하다
  • 특히, 팀 프로젝트를 개발할 때 각자의 코드를 합치는 과정에서 함수명 중복이 일어날 수 있다.

함수 포인터

0개의 댓글