문제
프로토타입 : char *ft_strtrim(char const *s1, char const *set)
문자열 s1의 맨 앞과 맨 뒤에 있는 문자가 문자열 set의 일부인 경우 이를 자른 s1을 반환하라.
주의할 점
- set이 빈 칸인 경우
- s1, set이 아예 없는 경우
구현
기존 코드의 경우
- s1[0]부터 set 안에 있는지 찾아냄
- s1[last]부터 set 안에 있는지 찾아냄
- i번째와 j번째 사이가 뽑아내야 할 문자인 경우, malloc으로 s2 할당
- s2[0] = s1[i] ⇒ i가 j로 갈때까지 돌려줌.
오류 확인 후 추가
- s1 == NULL 또는 set == NULL일때 확인
- 변수명 변경 및 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);
}