Part.2의 함수들은 다른 언어에 존재하는 함수들을 구현하는 것이다.
이 파트에서 어려움을 많이 겪었다고 할 수 있다.
char *ft_strtrim(const char *s1, char const set);
이 함수가 원하는 기능은, s1의 문자열의 내용에서 set과 겹치는 문자가 있으면, 앞과 뒤에서 각각 그 문자들을 다 지우는 것이다.
ex)
s1[] = "aeaehelloaeae";
set[] = "ea";
printf("%s", ft_strtrim(s1, set);
위의 경우 hello
가 출력되어야 하는 것이다.
이 두개가 가장 큰 문제(?) 구현해야 할 내용이다.
나는 두번째 내용에서 어려움을 겪었는데, while문을 2개로 구현해야 한다는 것과 if문으로 일치하는지 확인해야겠다는 생각은 들었다.
그러나 모두 set에 포함된 문자열인 경우 끝 인덱스부터 시작하는 while문은 결국 0까지 가게 되어 오류가 발생하였다.
while (end > i && (set과 s1[end] 비교하는 함수))
와 같이 while문 조건에 &&으로 끝 인덱스와 처음 인덱스를 비교하는 내용을 포함하게 되었다.
char **ft_split(chat const *s, char c)
블로그를 개설하기로 맘 먹었을 때, 사실상 주인공.
이 함수를 구현하면서, 가장 어려움을 많이 겪었는데, 테스트를 고치면 다른 테스트에서 터지고, 둘다 고치면 또 다른 테스트에서 터지고 다 고치면 처음 테스트에서 터지고..... ~~감동 실화,,,~~
구현하면서 어려웠던 점 여러가지를 적어보자면
이 4가지가 가장 큰 의문이었고, 사소하게는 코드 25줄 안으로 줄이기, 선언한 것들 5개 이하로 줄이기가 있었다.
while (s[i] != '\0')
{
if (s[i] != c && s[i])
{
j++;
while (s[i] != c && s[i])
i++;
}
else if (s[i])
i++;
}
return (j);
위의 코드로 이중 배열의 가로 줄 크기를 할당해주었다.
내가 많이 사용한 알고리즘인데, split해 줄 문자와 일치하지 않는 문자열을 찾고 그 다음 while문을 통해 일치하는 문자의 인덱스를 찾는 것이다.
이중 배열의 큰 틀을 생성한 뒤, 다른 함수에서 이중 배열 한칸 한칸 즉, 세로에 해당하는 크기를 각각 할당해 주었다.
✅ 가로? 세로? 무슨 얘기를 하는 것인지 모르겠다면!
0000
111
22222
3
여기서 내가 말하는 이중 배열의 가로 줄 크기는 4이고 세로의 크기는 각각 4,3,5,1이다.
세로의 크기를 할당해 주기 위해, 위의 코드와 비슷하지만 다른 코드를 구현하였는데,
while (s[k])
{
if (s[k] != c)
{
z = k;
while (s[k] != c && s[k] != 0)
k++;
if (!(new[i] = (char*)malloc(sizeof(char) * (k - z + 1))))
{
letfree(new, i);
return (0);
}
ft_strlcpy(new[i++], (s + z), (k - z + 1));
}
else
k++;
}
new[i] = 0;
하나의 새로운 문자를 사용하여, 할당해 줄 크기 계산을 용이하게 하였다.
또한 이전에 구현하였던 함수와 포인터 개념을 활용하여 할당해 준 배열에 문자열을 복사하여 넣었다.
letfree(str, n)함수는 new가 이중 배열이기 때문에 새로 만들어준 함수이다.
메모리 누수 (memory leak)을 방지하기 위해 구현한 함수인데, new[]를 0부터 n까지 free로 할당을 반납해 준 뒤에 new도 할당을 반납해주었다.