substr?

//원 함수 없음
    char *ft_substr(char const *s, unsigned int start, size_t len);

구현해야할 함수 기능

: Allocates (with malloc(3)) and returns a substring from the string ’s’. The substring begins at index ’start’ and is of maximum size ’len’.

해석 및 부연설명

: 문자열 s에서 원하는 부분만큼(start부터 len만큼) 잘라 반환한다. 지정된 반환값은 부분 문자열이며 할당 실패 시에는 NULL을 반환한다.

ex)

char	str[] = "abcdefgehijk";
char	*substr = ft_substr(str, 5, 3);
printf("%s\n", substr);

코드 실행 결과

fge

str[5]인 f부터 3개의 문자가 저장된 문자열이 정상적으로 출력되었다.

의문점 및 생각해볼점

  1. start가 문자열 s의 길이보다 클 경우
  2. NULL string에 관해

start >= strlen(s)

과제에는 이 경우에 어떻게 하라는 지시사항이 명확하게 존재하지 않고, 원 함수도 존재하지 않으니 내가 어떤 식으로 처리할 것인지가 관건인 것 같다.
결국 할당을 실패한 것은 아니므로 NULL반환이 아닌 NULL string(="")을 반환하기로 결정했다.


NULL string

해당 주제에 관한 열띤 논쟁
알기쉽게 정리된 링크
NULNULLNULL string은 서로 다르다.

  • NUL은 ascii코드 0번인 \0을 뜻한다.
  • NULLNULL pointer = 0x00000000 = (void *)0을 뜻한다.
  • NULL string""인 빈 문자열을 뜻한다.

ft_substr 구현

char	*ft_substr(char const *str, unsigned int start, size_t len)
{
	char	*substr;
	char	*result;
	size_t	str_len;

	str_len = ft_strlen(str);
	if (start >= ft_strlen(str))
		return (ft_strdup(""));
	else if (len + start > str_len)
		substr = (char *)malloc((str_len - start + 1) * sizeof(char));
	else
		substr = (char *)malloc((len + 1) * sizeof(char));
	if (!substr)
		return (NULL);
	result = substr;
	while (*(str + start) && len-- > 0)
		*substr++ = *(str + start++);
	*substr = 0;
	return (result);
}

  • substr을 할당하는 부분이 먼저 올 경우 start >= ft_strlen(str)일 때 free를 해주어야하지만 ft_substr 함수에서 허용된 외부함수는 malloc 뿐이었다.
    따라서 먼저 start 조건을 체크를 한 뒤 걸리지 않았을 때 substr을 할당하도록 순서를 조정했다.
  • start >= ft_strlen(str) 조건에 걸려 NULL String을 반환하는 경우, 단순히 return ("")을 할 경우 에러가 발생했다.
    그낭 ""는 앞서 한번 얘기한 적 있는 리터럴이기 때문에 strdup 함수를 이용해 쓸 수 있는 영역의 메모리를 할당받도록 하는 작업이 필요했다.
  • len + start의 값이 문자열 str의 길이보다 클 경우 (len + 1)만큼을 할당한다면 필요한 메모리 이상의 크기가 할당된다. 따라서 경우를 나누어 딱 쓰일 만큼의 메모리 공간만 할당하도록 했다.