Dia Egg - Shugo Chara

C

strlcat 함수의 구현 (+strlcat 함수의 리턴값에 대해)

별ㅇI 2023. 10. 16. 17:33
728x90
반응형

strlcat 함수

  • string.h 라는 헤더 파일에 속한 함수.
  • 원형은 size_t strlcat(char * restrict dst, const char * restrict src, size_t dstsize)를 따른다. 
  • dst의 뒤에 src를 dstsize 만큼(마지막에 null포함) 붙이는 함수이다. 이때 리턴 값은 null을 제외한 복사 전체 문자열의 수, 즉, 다시 말하지면 src길이 + dest길이.
  • dstsize가 dst보다 작다면 수행하지않는다. 이때 리턴 값은 src의 길이 + dstsize.

strlcat 함수의 리턴값에 대해

dstsize가 dst보다 작다면 수행하지않고, 리턴 값은 src의 길이 + dstsize라는 점에 대해 왜 그런지 의문을 품었다. 

매뉴얼을 보면,

라는 부분을 확인할 수 있었다. 번역하자면 " 반환값이 >= dstsize이면 출력 문자열이 잘린 것입니다.  이는 호출자의 능력으로 조정가능합니다."라고 번역될 수 있다. 즉 리턴값으로 문자열이 잘린지를 판단가능하게 하기위해서 이러한 패턴을 만들었다고 생각된다. 

정리했던 패턴으로 수행하면 dstsize가 return값보다 크거나 같은 경우는 dstsize가 dst보다 작은 경우 밖에 없다. 매개변수로 주는 dstsize는 null을 포함하는 길이지만 return하는 길이는 null을 제외한 길이이기 때문이다.

즉, 하나라도 붙인경우(dst의 길이 < dstsize), 길이가 부족하여 아무것도 수행되디않은 경우(dst의 길이 < dstsize)를 리턴 값을 통해 구분하기 위한 것이라고 이해했다. '

strlcat 함수의 구현

size_t	ft_strlcat(char *restrict dst, const char *restrict src, size_t dstsize)
{
	size_t	i;
	size_t	j;
	size_t	ori_dst;

	i = 0;
	j = 0;
	ori_dst = ft_strlen(dst);
	if (ft_strlen(dst) > dstsize)
		return (ft_strlen(src) + dstsize);
	while (dst[i] != '\0')
		i++;
	while (i + 1 < dstsize && src[j] != '\0')
		dst[i++] = src[j++];
	while (i < dstsize)
	{
		dst[i] = '\0';
		i++;
	}
	return (ori_dst + ft_strlen(src));
}
// #include<string.h>
// #include<stdio.h>
// int main(void)
// {
// 	char src1[10] = "apple";
//     char dst1[10] = "pie";
// 	size_t	i = 0;
// 	printf("test1: strlcat_return : %lu", strlcat(dst1, src1, 9));
// 	printf("\ntest1: strlcat: ");
// 	while (src1[i] != '\0')
// 		printf("%c", src1[i++]);
// 	char src2[10] = "apple";
//     char dst2[10] = "pie";
// 	i = 0;
// 	printf("\ntest1: ft_strlcat_return : %lu", ft_strlcat(dst2, src2, 9));
// 	printf("\ntest1: ft_strlcat: ");
// 	while (src2[i] != '\0')
// 		printf("%c", src2[i++]);
// 	char src3[10] = "apple";
//     char dst3[10] = "pie";
// 	i = 0;
// 	printf("\ntest2: strlcat_return : %lu", strlcat(dst3, src3, 0));
// 	printf("\ntest2: strlcat: ");
// 	while (src3[i] != '\0')
// 		printf("%c", src3[i++]);
// 	char src4[10] = "apple";
//     char dst4[10] = "pie";
// 	i = 0;
// 	printf("\ntest2: ft_strlcat_return : %lu", ft_strlcat(dst4, src4, 0));
// 	printf("\ntest2: ft_strlcat: ");
// 	while (src4[i] != '\0')
// 		printf("%c", src4[i++]);
// }
728x90
반응형