Home Libft ④ Additional functions
Post
Cancel

Libft ④ Additional functions

Functions

ft_substr

s 문자열에서 start 부터 len 만큼의 문자열을 할당한 메모리에 복사

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

  • 매개변수
    • s: 하위 문자열을 만드는 데 사용할 문자열
    • start: 문자열 ‘s’에 있는 하위 문자열의 시작 인덱스
    • len: 하위 문자열의 최대 길이
  • 코드
    • tmp = (char *)malloc(sizeof(char) * (len = s_len + 1)); : len이 쓸데없이 길게 들어오는 경우 len에 s의 길이를 저장한 채로 할당함.
    • (size_t)start >= s_len : 인덱스가 s의 길이를 벗어남
    • !(ft_strlcpy(tmp, s + start, len + 1)) :
      • 가운데 매개변수의 의미: s가 0번인덱스에 해당하는 주소값 s + start는 start번 인덱스에 해당하는 주소값임.
      • strlcpy의 return이 0이라는건 매개변수src에 해당하는 s+start가 null이라는의미 → 0번 인덱스에 null 저장.

ft_strjoin

문자열 두개를 합쳐서 리턴하는 함수

char *ft_strjoin(char const *s1, char const *s2)

  • 매개변수
    • s1: 앞부분
    • s2: 뒷부분
  • 반환값
    • 새로운 문자열
    • NULL (할당실패 시)
  • strlcat과의 차이?
    • strlcat: 동작: 기존 문자열을 늘림. 반환: 합친문자열의 길이
    • strjoin: 동작: 새로운 문자열에다가 붙인걸 저장. 반환: 만든 문자열
  • 구현방법
    1. malloc
    2. ft_memcpy(tmp, s1, len_s1) : tmp에 s1 복사(len_s1 잴 때 널은 제외했으므로 널 빼고 복사됨)
    3. ft_memcpy(tmp + len_s1, s2, len_s2) : tmp 뒤에(s1으로 치면 널이 들어올 자리)부터 s2 붙이기
    4. tmp[len_s1 + len_s2] = '\0' 끝에다가 널 삽입

ft_strtrim

문자열의 시작과 끝에서 ‘set’에 지정된 문자가 제거된 ‘s1’의 복사본을 리턴

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

  • 매개변수
    • s1: 기존 문자열
    • set: 잘라낼 문자열의 참조세트
  • 리턴값
    • 잘린 문자열
    • 할당실패시 → null

set에 포함되는 문자가 s1의 맨 앞이랑 맨 뒤에 있으면 지워나가기(파이썬의 strip() 함수의 기능과 유사함)

  • 구현방법
    1. 널체크
    2. 앞에서부터 strchr()로 포함되는 문자가 있으면 주소값을 더해가기
    3. 뒤에서부터 strchr()로 포함되는 문자가 있으면 인덱스를 빼가기
    4. substr()로 0부터 i+1 만큼 복사

ft_split

문자열을 구분자로 나누어 2차원 배열에 저장해 리턴하는 함수

char **ft_split(char const *s, char c)

  • 리턴값
    • 배열(잘린 문자열들)
    • 할당실패시 → NULL
  • 매개변수
    • s: 잘릴 문자열
    • c: 구분자

메모리 할당 → c로 자르고 → 배열(맨뒤는 널포인터) 리턴

  • 메모리 할당할 크기 (아래 그림 참고)
    1. sizeof(char *) * (ft_wordnum + 1) : 2차원 (각 줄의 포인터 크기 x 줄수)
    2. (char *)malloc(idx2 + 1) : 1차원 (각 줄(단어)의 길이)

ex) s="anthony" c='n' 라고 할 때 아래와 같음

split1

  • 방법 구상
    1. 나눌 문자 개수 구하기
    2. 전체 단어용 2d malloc
    3. 단어 자르기
    4. 각 단어용 1d malloc
    5. 배열에 한 단어씩 저장
    6. free() 반드시!!
  • 함수 종류
    • ft_wordnum : 나눌 단어의 총 개수
    • ft_free : ft_cutword 에서 메모리할당에 실패할 때 memory leak 방지. 각 문자들을 모두 free 하고 난 후, 전체 result를 free하는 순서로 해야함.
    • ft_cutword : 단어 자름
    • ft_split : 기본 함수
  • 변수 종류
    • word : 단어의 개수
    • idx1 : (s+idx1) s에서 현재 보고있는 인덱스
    • idx2 : 각 단어의 길이

split2

  • 구현 방법
    1. ft_split 함수
      1. ft_wordnum으로 나눌 문자의 개수 구함
      2. (그 개수+1)*(char *의 크기) 만큼 2d 메모리 할당(위 이미지)
      3. (result + count) = 0 배열 끝줄에 널값 넣기
    2. ft_cutword 함수
      1. while (*(s + idx1 + idx2) != c && *(s + idx1 + idx2)) s에서 c를 찾을때의 인덱스 구함
      2. ft_memcpy(*(result + word), s + idx1, idx2)
      3. *(*(result + word) + idx2) = 0 : 각 줄 배열의 끝칸에 널값 넣기
      4. idx1 += idx2 : 인덱스 뒤로 땡기기
      5. 문제 생기면 (free 후) 0 리턴, 아니면 1 리턴

ft_itoa

int형태로 수를 집어넣으면 문자열 형태로 리턴

atoi의 반대 역할을 하는 함수이다. malloc을 통해 메모리할당하여 각 자리수를 넣으면 될 듯. 음수도 처리하는게 관건이다.

  • 구현순서
    1. 부호 판단 (0과 대소비교) (ft_signcheck)
    2. 자릿수 체크 (ft_digitcheck)
    3. malloc
      • 양수: digit+1 (널값)
      • 음수 : digit+2 (마이너스, 널값)
    4. 배열에 저장
      • 포인터 역참조 활용.
      • 음수일땐 맨앞에 ‘-’ 추가

ft_strmapi

문자열 s를 돌면서 f함수를 적용하여 리턴

char *ft_strmapi(char const *s, char (*f)(unsigned int, char))

  • 매개변수
    • s: 순환할 문자열
    • f: 적용할 함수
  • 구현방법
    1. 인수 널체크
    2. 메모리 할당→널체크
    3. 값 저장 함수포인터이므로 (res + i) = f(i, *(s + i)) 다음과 같이 저장

ft_striteri

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

문자열 s를 돌면서 f함수를 적용하는 함수 (strmapi와의 차이: 리턴여부)

  • 매개변수
    • s: 반복할 문자열
    • f: 적용할 함수

ft_putchar_fd

write (파일 디스크립터, 출력할 버퍼의 포인터, 출력할 개수)

파일 디스크립터에 버퍼를 정해준 개수만큼 기록

  • 매개변수
    • c: 출력할 문자
    • 파일 디스크립터

ft_putstr_fd

파일 디스크립터에 따라서 문자열을 출력

  • 매개변수
    • s: 출력할 문자열
    • fd: 파일 디스크립터

ft_putendl_fd

끝에 ‘\n’이 추가된 문자열을 fd파일 디스크립터 형식으로 출력

putstr, putchar 활용해서 구현

ft_putnbr_fd

파일디스크립터로 주어진 정수 출력

  1. 첫번째 코드→금지함수(malloc) 사용
    int → char * → write
    • 구현방법
      1. itoa()
      2. putstr_fd()
    1
    2
    3
    4
    
     void	ft_putnbr_fd(int n, int fd)
     {
         ft_putstr_fd(ft_itoa(n), fd);
     }
    
  2. 두번째 코드
    • 구현방법
      1. 파일디스크립터 체크
      2. INT_MIN → 바로 출력
      3. 음수면→양수로
      4. 10단위로 재귀함수를 통해 제일 높은 자리수부터 출력

Ref.

2차원 배열에서의 널값

This post is licensed under CC BY 4.0 by the author.

조건문 안에서 변수 할당하기

norminette 개인pc 설치방법