42Seoul/libft

libft - strlcpy, strlcat, strncmo

재윤 2023. 3. 24. 10:55
반응형

strlcpy

strlcpy 함수

헤더 파일: <string.h>

함수 원형: char* strlcpy(char* dest, const char* origin, size_t size);

정의: 문자열을 복사해주는 함수이다. dest안에 src의 값 size만큼을 복사해준다.

  1. size는 src의 길이 이하 일 때 이용됨.
  2. strlcpy는 src의 ‘\0’ 값을 만나기 전 혹은 size -1 만큼 복사가 이루어졌을 때 복사를 중지한다.

쉽게 설명해보자

이 친구는 dest, src, size가 있는데

src의 문자열을 dest에 복사해줌, 그리고 리턴은 src의 길이를 리턴

size는 src의 길이보다 작아도 됨

ex) src = “123456”, size = 5

리턴값은 src의 길이인 6 dest은 “1234” 이렇게 들어감

코드에서 왜 size - 1 만큼해주냐

src = “123456”, size = 6

리턴값은 src의 길이인 6 dest은 “12345” 이렇게 들어감

근데 dest 마지막에 null 넣어줘야해서 자리 하나 남겨놓기 위해 남겨둠

size_t	ft_strlcpy(char *dest, const char *src, size_t size)
{
	unsigned int	i;
	unsigned int	j;

	i = 0;
	while (src[i] != '\\0')
		i++;
	if (size != 0)
	{
		while (src[j] != '\\0' && j < (size - 1))
		{
			dest[j] = src[j];
			j++;
		}
		dest[j] = '\\0';
	}
	return (i);
}

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

int main()
{
	char s[10] = "123456";
	char dest[10];
	unsigned int a= strlcpy(dest, s, 0);
	printf("%u\\n", a);
	printf("%s\\n",s );
	printf("%s\\n",dest );
}

 

사이즈가 0이면 아무것도 안 들어감, 1일 때는 널값이 들어감

[42seoul] strlcpy는 어떤 함수일까??

 

[42seoul] strlcpy는 어떤 함수일까??

libft 과제 중 strlcpy에 대해 정리해 봤다.

velog.io

strlen, strlcpy, strlcat 함수 구현(2021.01.07 업데이트)

 

strlen, strlcpy, strlcat 함수 구현(2021.01.07 업데이트)

틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다! 💡 strlen에 대하여 환경 c, c++ C에서는 C++에서는 Prototype char* strlen(char* str); str : c 형식 문자열 Return Value 문자열의 길이를 return 한다

minsoftk.tistory.com

 

strlcat

함수원형

size_t	ft_strlcat(char *dest, const char *src, size_t size)

문자열 붙여넣기

size = len(dest) + len(src) + null을 생각해야함.

즉, size = len(dest) + len(src) + 1임.

while문 조건에 (len(dest) + i + 1) 들어가면 됨

리턴값

  1. size가 dest의 길이보다 크면 len(dest) + len(src)
  2. size가 dest의 길이보다 작거나 같으면 len(src) + size
#include "libft.h"

size_t	ft_strlen(const char *src)
{
	size_t	i;

	i = 0;
	while (src[i] != '\\0')
	{
		i++;
	}
	return (i);
}

size_t	ft_strlcat(char *dest, const char *src, size_t size)
{
	size_t	i;
	size_t	dest_len;
	size_t	src_len;
	size_t	dest2_len;
	size_t	src2_len;

	i = 0;
	dest_len = ft_strlen(dest);
	src_len = ft_strlen(src);
	dest2_len = dest_len;
	src2_len = src_len;
	while (dest2_len + i + 1 < size && src[i] != '\\0')
	{
		dest[dest_len] = src[i];
		i++;
		dest_len++;
	}
	dest[dest_len] = '\\0';
	if (dest2_len < size)
		return (dest2_len + src2_len);
	else if (dest_len >= size)
		return (src2_len + size);
	return (0);
}

strlen, strlcpy, strlcat 함수 구현(2021.01.07 업데이트)

 

strlen, strlcpy, strlcat 함수 구현(2021.01.07 업데이트)

틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다! 💡 strlen에 대하여 환경 c, c++ C에서는 C++에서는 Prototype char* strlen(char* str); str : c 형식 문자열 Return Value 문자열의 길이를 return 한다

minsoftk.tistory.com

strlcat 반환값에 대한 고찰

 

strlcat 반환값에 대한 고찰

들어가며. 이 글은 42서울의 라피신 과정중 가장 고민했던 함수였던 strlcat에 대한 설명이고, 특히나 '반환값'에 대한 고찰이 담겨있습니다. strlcat에 대한 설명은 man strlcat 이나 다른 블로그에도

ksabs.tistory.com

 

strncmp

int strncmp(const char* str1, const char* str2, size_t n);

첫번째 매개변수 str1 : 비교할 문자열1

두번재 매개변수 str2 : 비교할 문자열2

세번째 매개변수 n : 비교할 문자열 길이

int	ft_strncmp(const char *str1, const char *str2, size_t n)
{
	size_t	i;

	i = 0;
	while ((str1[i] != '\\0' || str2[i] != '\\0') && i < n)
	{
		if (str1[i] != str2[i])
			return ((unsigned char)str1[i] - (unsigned char)str2[i]);
		i++;
	}
	return (0);
}

조건

  1. size_t이기 때문에 0값이 들어올 수 없다!
  2. str1, str2 문자열보다 큰 값을 넣게 되면 알아서 문자열의 전체를 비교한다.

주의할점 while문 조건에서 str들을 널값까지 돌리는데 or연산으로 해야함 만약 and연산으로 하면 둘 중에 하나가 널값 가기 전에 끝남.

#include "libft.h"

int	ft_strncmp(const char *str1, const char *str2, size_t n)
{
	size_t	i;

	i = 0;
	while ((str1[i] != '\\0' || str2[i] != '\\0') && i < n)
	{
		if (str1[i] != str2[i])
			return ((unsigned char)str1[i] - (unsigned char)str2[i]);
		i++;
	}
	return (0);
}

int main()
{
	char str1[10] = "abc";
	char str2[15] = "abc";
	printf("%d\\n", ft_strncmp(str1, str2, 3));
	
	char str3[10] = "abc";
	char str4[15] = "abc";
	printf("%d\\n", strncmp(str3, str4, 3));

}
반응형

'42Seoul > libft' 카테고리의 다른 글

libft - strrchr, memchr, memcmp  (2) 2023.03.24
libft - toupper, tolower, strchr  (0) 2023.03.24
libft - bzero, memcpy, memove  (0) 2023.03.24
libft - isascii, isprint, memset  (0) 2023.03.24
libft - isalpha, isdigit, isalnum  (0) 2023.03.24