[libft] ft_substr
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개의 문자가 저장된 문자열이 정상적으로 출력되었다.
의문점 및 생각해볼점
start >= strlen(s)
과제에는 이 경우에 어떻게 하라는 지시사항이 명확하게 존재하지 않고, 원 함수도 존재하지 않으니 내가 어떤 식으로 처리할 것인지가 관건인 것 같다.
결국 할당을 실패한 것은 아니므로 NULL
반환이 아닌 NULL string(="")
을 반환하기로 결정했다.
NULL string
해당 주제에 관한 열띤 논쟁
알기쉽게 정리된 링크
NUL
과 NULL
과 NULL string
은 서로 다르다.
- NUL은 ascii코드 0번인 \0을 뜻한다.
- NULL은
NULL 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)만큼을 할당한다면 필요한 메모리 이상의 크기가 할당된다. 따라서 경우를 나누어 딱 쓰일 만큼의 메모리 공간만 할당하도록 했다.