본문 바로가기

프로그래밍/C

[library] strtrim 구현하기

📌 매뉴얼 (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
Recent Posts
Popular Posts
Recent Comments