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: 동작: 새로운 문자열에다가 붙인걸 저장. 반환: 만든 문자열
- 구현방법
- malloc
ft_memcpy(tmp, s1, len_s1)
: tmp에 s1 복사(len_s1 잴 때 널은 제외했으므로 널 빼고 복사됨)ft_memcpy(tmp + len_s1, s2, len_s2)
: tmp 뒤에(s1으로 치면 널이 들어올 자리)부터 s2 붙이기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()
함수의 기능과 유사함)
- 구현방법
- 널체크
- 앞에서부터 strchr()로 포함되는 문자가 있으면 주소값을 더해가기
- 뒤에서부터 strchr()로 포함되는 문자가 있으면 인덱스를 빼가기
- substr()로 0부터 i+1 만큼 복사
ft_split
문자열을 구분자로 나누어 2차원 배열에 저장해 리턴하는 함수
char **ft_split(char const *s, char c)
- 리턴값
- 배열(잘린 문자열들)
- 할당실패시 → NULL
- 매개변수
- s: 잘릴 문자열
- c: 구분자
메모리 할당 → c로 자르고 → 배열(맨뒤는 널포인터) 리턴
- 메모리 할당할 크기 (아래 그림 참고)
sizeof(char *) * (ft_wordnum + 1)
: 2차원 (각 줄의 포인터 크기 x 줄수)(char *)malloc(idx2 + 1)
: 1차원 (각 줄(단어)의 길이)
ex) s="anthony"
c='n'
라고 할 때 아래와 같음
- 방법 구상
- 나눌 문자 개수 구하기
- 전체 단어용 2d malloc
- 단어 자르기
- 각 단어용 1d malloc
- 배열에 한 단어씩 저장
free()
반드시!!
- 함수 종류
ft_wordnum
: 나눌 단어의 총 개수ft_free
:ft_cutword
에서 메모리할당에 실패할 때 memory leak 방지. 각 문자들을 모두 free 하고 난 후, 전체 result를 free하는 순서로 해야함.ft_cutword
: 단어 자름ft_split
: 기본 함수
- 변수 종류
word
: 단어의 개수idx1
: (s+idx1) s에서 현재 보고있는 인덱스idx2
: 각 단어의 길이
- 구현 방법
- ft_split 함수
- ft_wordnum으로 나눌 문자의 개수 구함
- (그 개수+1)*(char *의 크기) 만큼 2d 메모리 할당(위 이미지)
(result + count) = 0
배열 끝줄에 널값 넣기
- ft_cutword 함수
while (*(s + idx1 + idx2) != c && *(s + idx1 + idx2))
s에서 c를 찾을때의 인덱스 구함ft_memcpy(*(result + word), s + idx1, idx2)
*(*(result + word) + idx2) = 0
: 각 줄 배열의 끝칸에 널값 넣기idx1 += idx2
: 인덱스 뒤로 땡기기- 문제 생기면 (free 후) 0 리턴, 아니면 1 리턴
- ft_split 함수
ft_itoa
int형태로 수를 집어넣으면 문자열 형태로 리턴
atoi의 반대 역할을 하는 함수이다. malloc을 통해 메모리할당하여 각 자리수를 넣으면 될 듯. 음수도 처리하는게 관건이다.
- 구현순서
- 부호 판단 (0과 대소비교) (
ft_signcheck
) - 자릿수 체크 (
ft_digitcheck
) - malloc
- 양수: digit+1 (널값)
- 음수 : digit+2 (마이너스, 널값)
- 배열에 저장
- 포인터 역참조 활용.
- 음수일땐 맨앞에 ‘-’ 추가
- 부호 판단 (0과 대소비교) (
ft_strmapi
문자열 s를 돌면서 f함수를 적용하여 리턴
char *ft_strmapi(char const *s, char (*f)(unsigned int, char))
- 매개변수
- s: 순환할 문자열
- f: 적용할 함수
- 구현방법
- 인수 널체크
- 메모리 할당→널체크
- 값 저장 함수포인터이므로
(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
파일디스크립터로 주어진 정수 출력
첫번째 코드→금지함수(malloc) 사용
int → char * → write- 구현방법
- itoa()
- putstr_fd()
1 2 3 4
void ft_putnbr_fd(int n, int fd) { ft_putstr_fd(ft_itoa(n), fd); }
- 구현방법
- 두번째 코드
- 구현방법
- 파일디스크립터 체크
- INT_MIN → 바로 출력
- 음수면→양수로
- 10단위로 재귀함수를 통해 제일 높은 자리수부터 출력
- 구현방법