열렬히.뛰기

ft_strtrim

école 42 > libft > ft_strtrim

문제

프로토타입 : char *ft_strtrim(char const *s1, char const *set)

문자열 s1의 맨 앞과 맨 뒤에 있는 문자가 문자열 set의 일부인 경우 이를 자른 s1을 반환하라.

주의할 점

  1. set이 빈 칸인 경우
  2. s1, set이 아예 없는 경우

구현

기존 코드의 경우

  1. s1[0]부터 set 안에 있는지 찾아냄
  2. s1[last]부터 set 안에 있는지 찾아냄
  3. i번째와 j번째 사이가 뽑아내야 할 문자인 경우, malloc으로 s2 할당
  4. s2[0] = s1[i] ⇒ i가 j로 갈때까지 돌려줌.

오류 확인 후 추가

  1. s1 == NULL 또는 set == NULL일때 확인
  2. 변수명 변경 및 while 조건 변경
    • 시작점에서 출발하는 변수 : l
    • while 조건 ⇒ set안에 있는지 찾아낼 뿐만 아니라, l이 전체 길이보다 작은지 체크
    • 끝점에서 출발하는 변수 : r
    • while 조건 ⇒ set안에 있는지 찾아낼 뿐만 아니라, r이 l보다 작은지 체크
      • r이 l보다 작지 않으면 l > r로도 될 수 있음. 이 경우 s2 할당 오류

코드

c
#include "libft.h"

size_t	ft_strlen(const char *str);

int	in(char x, const char *set)
{
	while (*set != '\0')
	{
		if (*set == x)
			return (1);
		set++;
	}
	return (0);
}

char	*ft_strtrim(char const *s1, char const *set)
{
	size_t	l;
	size_t	r;
	size_t	len;
	size_t	n;
	char	*s2;

	if (s1 == NULL || set == NULL)
		return ((char *)s1);
	l = 0;
	len = ft_strlen(s1);
	while (l < len && in(s1[l], set))
		l++;
	r = len;
	while (r > l && in(s1[r - 1], set))
		r--;
	s2 = (char *)malloc((r - l + 1) * sizeof(char));
	if (!s2)
		return (NULL);
	n = 0;
	while (l < r)
		s2[n++] = s1[l++];
	s2[n] = '\0';
	return (s2);
}