〖Libft〗 ➂

hyeonjin-dot·2021년 1월 19일
0

42seoul

목록 보기
4/7

Part.2

Part.2의 함수들은 다른 언어에 존재하는 함수들을 구현하는 것이다.
이 파트에서 어려움을 많이 겪었다고 할 수 있다.

ft_strtrim.c

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

이 함수가 원하는 기능은, s1의 문자열의 내용에서 set과 겹치는 문자가 있으면, 앞과 뒤에서 각각 그 문자들을 다 지우는 것이다.

ex)
s1[] = "aeaehelloaeae";
set[] = "ea";

printf("%s", ft_strtrim(s1, set);

위의 경우 hello가 출력되어야 하는 것이다.

  • set의 문자열 각각으로 s1과 비교하기
  • s1의 처음과 끝부터 각각 비교하기

이 두개가 가장 큰 문제(?) 구현해야 할 내용이다.
나는 두번째 내용에서 어려움을 겪었는데, while문을 2개로 구현해야 한다는 것과 if문으로 일치하는지 확인해야겠다는 생각은 들었다.
그러나 모두 set에 포함된 문자열인 경우 끝 인덱스부터 시작하는 while문은 결국 0까지 가게 되어 오류가 발생하였다.
while (end > i && (set과 s1[end] 비교하는 함수)) 와 같이 while문 조건에 &&으로 끝 인덱스와 처음 인덱스를 비교하는 내용을 포함하게 되었다.

⭐️ft_split⭐️

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도 할당을 반납해주었다.

profile
응애 나 애기 블로거

0개의 댓글