ft_substr

ft_substr

“ft_substr에 대하여”

<목차>

1. MY CODES

2. 사용과 설명

ft_substr – 문자열과 시작 지점과 길이를 매개변수로 받아서, 문자열 시작 지점부터 길이만큼을 포함하는 새로운 문자열을 할당하여 반환한다.

(1) MY CODES

#include "libft.h"

char	*ft_substr(char const *s, unsigned int start, size_t len)
{
	char	*substr;

	if (len >= ft_strlen(s))
		len = ft_strlen(s);
	if (ft_strlen(s) < start)
		return (ft_strdup(""));
	if (ft_strlen(s) - start < len)
		substr = (char *)malloc(sizeof(char) * (ft_strlen(s) - start) + 1);
	else
		substr = (char *)malloc(sizeof(char) * (len + 1));
	if (!substr)
		return (NULL);
	ft_strlcpy(substr, (char *)(s + start), len + 1);
	return (substr);
}

(2) 사용과 설명

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char	*ft_substr(char const *s, unsigned int start, size_t len)
{
	char	*substr;

	if (len >= strlen(s))
		len = strlen(s);
	if (strlen(s) < start)
		return (strdup(""));
	if (strlen(s) - start < len)
		substr = (char *)malloc(sizeof(char) * (strlen(s) - start) + 1);
	else
		substr = (char *)malloc(sizeof(char) * (len + 1));
	if (!substr)
		return (NULL);
	strlcpy(substr, (char *)(s + start), len + 1);
	return (substr);
}

int main()
{
	char	s[] = "I love apple juice!";
	char	*ss = ft_substr(s, 2, 4);
	printf("%s\n", ss);
	return 0;
}
output :
	love
  • 문자열 “I love apple juice!”에서 2번째 인덱스인 ‘l’부터 4글자를 따와서 만든 새로운 문자열을 할당하여 반환했다. 이 함수를 구현할 때 신경써야할 것 몇 가지를 살펴보고자 한다.

(1) len이 문자열 s의 길이보다 길 때

  • substr은 매개변수 문자열로부터 부분 문자열을 만드는 건데, 그 부분 문자열이 원본 문자열보다 긴 것은 사리에 맞지 않는다. 이 경우 우선 len을 원본 문자열의 길이로 바꾼다.
	...
	if (len >= strlen(s))
		len = strlen(s);
	...

(2) start가 문자열 s의 길이보다 길 때

  • 원본 문자열에서 부분 문자열을 만들어내는데, 그 시작점이 원본 문자열의 인덱스 바깥에 있으면 부분 문자열을 만들어낼 수가 없다. 이 경우 빈 문자열을 반환한다.
	...
	if (strlen(s) < start)
		return (strdup(""));
	...

(3) len이 부분 문자열이 가질 수 있는 최대 길이(원본 문자열 길이 - start)보다 길게 들어왔을 때

  • applejuice에서 j부터 부분 문자열을 만든다고 했을 때, 부분 문자열이 가질 수 있는 최대 길이는 5글자이다(juice). 그러나 len이 6 이상으로 들어오게 되면 malloc을 하고도 채우지 않는 메모리 공간이 생기게 된다.
  • 이것을 방지하기 위해 len이 부분 문자열이 가지는 최대 길이보다 길어질 경우 malloc을 len만큼 하는 것이 아니라 부분 문자열이 가지는 최대 길이만큼만 해야 한다.
	...
	if (ft_strlen(s) - start < len)
		substr = (char *)malloc(sizeof(char) * (ft_strlen(s) - start) + 1);
	else
		substr = (char *)malloc(sizeof(char) * (len + 1));
	...