📌 매뉴얼 (in subject)
Function name
do_strtrim
Prototype
char *do_strtrim(char const *s1, char const *set);
Parameters
s1: The string to be trimmed. set: The reference set of characters to trim.
: s1은 잘라낼 문자열. / set: 잘라낼 문자의 참조 집합
Return value
The trimmed string. NULL if the allocation fails.
: 잘라낸 문자열. 할당에 실패하면 NULL
External functs
malloc
Description
Allocates (with malloc(3)) and returns a copy of ’s1’ with the characters specified in ’set’ removed from the beginning and the end of the string.
: malloc을 사용하여 할당하고 문자열의 처음과 끝에서 'set'에 지정된 문자가 제거된 's1' 복사본을 반환
📌 작성 코드
char *do_strtrim(char const *s1, char const *set)
{
char *str;
size_t i;
size_t a;
size_t s1_len;
if (s1 == NULL)
return (NULL);
s1_len = do_strlen(s1);
i = 0;
a = 0;
while (do_strchr(set, s1[i]) != 0 && s1[i] != '\0')
i ++;
while (do_strchr(set, s1[s1_len - 1]) != 0 && s1_len > i)
s1_len --;
str = (char *)malloc(sizeof(char) * (s1_len - i + 1));
if (str == NULL)
return (NULL);
while (i < s1_len)
{
str[a] = s1[i];
a ++;
i ++;
}
str[a] = '\0';
return (str);
}
📌 코드 리뷰
strtrim 함수는 문자열의 맨앞과 맨뒤에서부터 각각 시작하여, set에 설정해둔 문자들 중 하나에 해당하면 제거하고,
그 외에 문자가 오면 그 이후부터는 제거하지않은 뒤 남은 최종 문자열을 반환해주는 함수이다.
예시를 들면, set에 설정된 문자열이 abc 이면,
aaabbcgoodcabca 과 같은 형태가 s1로 들어올때, good만 잘라낸다.
aaabbcgoabcodcabca 처럼 중간에 set에 설정된 문자열이 들어오면 해당 부분은 잘라지지 않고 goabcod 로 잘라진다.
맨앞과 맨뒤의 set 설정 문자를 지우는 것이 목적이므로 위처럼 동작하게 된다.
처음에는 우선 s1이 아무것도 없는 NULL이 들어올 경우, 바로 NULL을 반환해준다.
그 후 길이를 구해주고, 이 맨뒤에서부터 설정 문자열을 확인하는 방법에 이 길이를 사용한다.
이제, strchr을 이용해서, s1의 문자 하나하나를 set에 있는지 점검하는 방식을 취한다.
반복문으로 문자열의 끝까지 확인해주며, set에 없는 문자가 나오면 반복을 종료한다.
우리는 이 방법을 통해 잘라진 문자열의 맨 앞 부분이 될 인덱스 'i'를 찾는다.
다시 strchr을 이용해서 이번에는 뒤에서부터 하나하나를 set에 있는지 점검해줄 것인데,
s1_len을 구한 것을 활용하여 이 값을 줄여가며 잘라진 문자열의 맨 뒷 부분이 될 인덱스 's1_len' 을 찾을 것이다.
(s1_len 대신 새로운 인덱스를 쓰는 것이 보기에 적절하겠지만, 최대한 변수 사용을 줄이기 위해 이를 사용했다.)
그렇게 s1_len을 줄여가며 반복하다, 이전에 구한 i 인덱스를 만나거나 set에 없는 문자가 나오면 종료한다.
set에 있는 문자만 존재해서 i가 이미 문자열 끝에 도달했다면, 위의 반복문은 바로 종료될 것이다.
자 그렇게 구해진 i와 s1_len을 통해 잘라진 문자열 처음과 끝부분을 알게 되었으니,
끝에서 처음 인덱스를 빼면 길이를 알 수 있다. (s1_len - i)
이 값에 \0을 넣을 1을 추가한 값을 malloc 으로 str에 할당해준다.
이제 반환할 str[]에 i부터 s1_len까지 넣어주고 \0을 마지막에 넣으면 우리가 원하는 잘라진 문자열이 str에 들어가게 된다.
(약간 가독성이 떨어질 수 있는 변수명과 인덱스 활용이 아쉽긴 하다.. 추후에 수정해볼 예정!)
'프로그래밍 > C' 카테고리의 다른 글
[library] itoa 구현하기 (0) | 2024.06.29 |
---|---|
[library] split 구현하기 (0) | 2024.06.29 |
[library] strjoin 구현하기 (0) | 2024.06.26 |
[library] substr 구현하기 (0) | 2024.06.18 |
[function] waitpid 함수 알아보기 (2) | 2024.06.13 |