strlcpy
strlcpy 함수
헤더 파일: <string.h>
함수 원형: char* strlcpy(char* dest, const char* origin, size_t size);
정의: 문자열을 복사해주는 함수이다. dest안에 src의 값 size만큼을 복사해준다.
- size는 src의 길이 이하 일 때 이용됨.
- 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일 때는 널값이 들어감
strlen, strlcpy, strlcat 함수 구현(2021.01.07 업데이트)
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) 들어가면 됨
리턴값
- size가 dest의 길이보다 크면 len(dest) + len(src)
- 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 업데이트)
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);
}
조건
- size_t이기 때문에 0값이 들어올 수 없다!
- 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 |