티스토리 뷰
틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다!
💡 strlen에 대하여
환경
- c, c++
- C에서는 <string.h>
- C++에서는
<cstring>
Prototype
char* strlen(char* str);
str
: c 형식 문자열
Return Value
-
문자열의 길이를 return 한다.
strlen 함수의 구현
#include <string.h> //NULL과 size_t를 쓰기 위한 헤더
size_t ft_strlen(const char *str)
{
size_t i;
i = 0;
while (str[i])
i++;
return (i);
}
💡 strlcpy에 대하여
환경
-
c, c++
-
c에서는 <string.h>
-
c++에서는
<cstring>
Prototype
int *strlcpy(const void *dest, const void *src, size_t size);
dest
: 붙여넣을 문자열src
: 복사할 문자열size
: size만큼의 복사를 한다. size는 문자열 끝의 NULL 까지 포함한 길이를 넣어줘야한다.
strlcpy 목적
- 이 함수는 strncpy랑 똑같이 데이터를 복사하는 건데 보안 목적으로 strncpy를 대신할 함수로 만들어졌다.
strlcpy, strlcat 들이 기존의 strncpy, strncat 과 차이점
-
strlcpy 함수는 strcpy 함수(src 문자를 대상버퍼(dst)에 복사)를 대상 버퍼를 오버플로우 할 수 없는 보안 버전으로 대체하기 위한 것이다. strcat에 대한 유사한 대안을 제공하는 strlcat도 있다.
-
버퍼 오버플로우를 방지하는 데 사용할 수 있는 표준 C함수 인 strncpy 및 strncat은 올바르게 사용하기 어렵고 느리게 만드는 결함을 가지고 있다. strlcpy 및 strlcat 은 올바른 사용법이 가능한 한 간단하도록 설계되었다.
-
이해하기 쉽게는 strn* 함수들에선 size만큼의 null을 넣어주고 strl* 함수들에선 마지막에만 null을 넣어준다. 생각해보면 끄덕끄덕...
Return Value
src
의 길이를 반환한다. 복사된 길이를 반환하므로 NULL은 빼고 길이를 계산한다.
strlcpy 함수의 구현
#include <string.h> //NULL과 size_t를 쓰기 위한 헤더
size_t ft_strlen(const char *str)
{
size_t i;
i = 0;
while (str[i])
i++;
return (i);
}
size_t ft_strlcpy(char *dest, const char *src, size_t size)
{
size_t i;
size_t temp;
i = 0;
temp = ft_strlen(src);
if (!dest || !src) //dest나 src 포인터의 가르키는 값이 없다면 0을 return
return (0);
while (i < temp && i + 1 < size) //i가 temp까지 그리고 null값을 포함해서 size보다 작아야 된다.
{
dest[i] = src[i];
i++;
}
if (size > 0) //만약 size가 0보다 크다면 문자열 마지막에 null값을 넣어준다
dest[i] = '\0';
return (temp);
}
💡 strlcat에 대하여
환경
-
c, c++
-
c에서는 <string.h>
-
c++에서는
<cstring>
Prototype
size_t ft_strlcat(char *dest, const char *src, size_t destsize);
-
dest
: 붙여넣을 문자열 -
src
: dest 뒤에 연결할 문자열 -
destsize
: size만큼의 대상 버퍼사이즈를 가진다. dest길이 + src길이 + null값을 destsize로 생각해서 넣어야 한다.
strlcat 목적
- 이 함수는 strncat랑 똑같이 데이터를 복사하는 건데 보안 목적으로 strncat을 대신할 함수로 만들어졌다.
- strlcat ()은 dst 의 초기 길이 + src 길이를 의미한다.
Return Value
dest
의 길이를 반환한다. 복사된 길이를 반환하므로 길이에서 NULL을 뺀 길이로 계산한다.destsize
가dest
의 크기보다 작을 때,strlen(src) + size
를 반환한다.destsize
가dest
의 크기보다 클 때,strlen(src) + strlen(dst)
를 반환한다.- 처음에 굉장히 헷갈렸던 부분이
destsize
이다.dest
가destsize
보다 큰 경우는destsize
크기를 벗어나기 때문에 문자열을 이어붙일 수가 없다. 따라서 연결작업은 건너 뛰고return (destlen + srclen)
해준다고 생각하면 된다.
- 즉,
destsize
는10
이지만dest
의 문자열의 길이가4
인 경우src
의 문자열은 6이 들어갈 수 있다. 반면destsize
가10
이지만dest
의 문자열의 길이가11
인 경우엔CONCATENATE(연결과정)
이 생략되고destsize
의 길이와 +src길이
값이 return 된다.
-
linux man 원문 번역
strlcpy() 및 strlcat() 함수는 생성하려는 문자열의 총 길이를 반환합니다. src의 길이를 의미하는 strlcpy()의 경우. strlcat()의 경우, dst의 초기 길이와 src의 길이를 의미한다. 다소 혼란스러워 보일 수 있지만, 절단 탐지를 단순화하기 위해 수행되었습니다. 그러나 strlcat()가 NUL을 찾지 않고 크기 문자를 트래버스하는 경우 문자열의 길이는 크기로 간주되고 대상 문자열은 NUL이 종료되지 않습니다(NUL을 위한 공간이 없기 때문에). 이렇게 하면 strlcat()이 문자열의 끝에서 떨어지는 것을 방지할 수 있습니다. 실제로 이러한 상황은 발생하지 않아야 합니다(그것은 크기가 잘못되었거나 dst가 적절한 "C" 문자열이 아님을 의미함). 잘못된 코드에서 발생할 수 있는 보안 문제를 방지하기 위해 검사가 존재합니다.
strlcat 함수의 구현
#include <string.h> //NULL과 size_t를 쓰기 위한 헤더
size_t ft_strlen(const char *str)
{
size_t i;
i = 0;
while (str[i])
i++;
return (i);
}
size_t ft_strlcat(char *dest, const char *src, size_t destsize)
{
size_t i;
size_t temp_i;
i = 0;
temp_i = 0;
while (dest[i] && i < destsize)
i++;
while (src[temp_i] && (i + temp_i + 1) < destsize)
{
dest[i + temp_i] = src[temp_i];
temp_i++;
}
if (i < destsize)
dest[i + temp_i] = '\0';
return (i + ft_strlen(src));
//처음에 먼저 srclen = ft_strlen(src); 선언후에
//마지막에 return을 해줬는데 while의 조건에 걸리지 않는 src의 경우를
//생각을 못한 것 같다. 이와 같이 마지막에 ft_strlen(src)를 써줘야 맞다.
}
- ft_strlen은 위에서 구현한 ft_strlen을 쓰시면 됩니다.
📕 reference :
728x90
반응형
'TIL(Today I Learn) > C++' 카테고리의 다른 글
is함수들 구현 (isalpha, isdigit, isascii, isalnum, isspace) (0) | 2021.01.07 |
---|---|
strchr, strnstr, strncmp 함수 구현 (0) | 2021.01.07 |
memchr, memcmp 함수 구현 (2021.01.07 업데이트) (2) | 2020.12.29 |
memcpy, memccpy, memmove 함수 구현 (2021.01.07 업데이트) (7) | 2020.12.29 |
memset, bzero 함수 구현 (0) | 2020.12.29 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 알고리즘
- html
- Git
- React
- JS
- 42서울
- C언어 문제
- vscode
- flexbox
- C언어
- 프로그래머스 자바
- c언어 함수
- 프로그래머스 카카오
- 자바스크립트
- C언어문제
- 42서울 라피신
- 백준
- vscode commit vi
- 42서울 합격 후기
- 42서울 합격
- windows 10 ubuntu
- c언어알고리즘
- 프로그래머스 코테
- 마크다운 이미지 업로드
- 42seoul
- HEXO
- JavaScript
- 프로그래머스 코딩테스트
- css
- git vi
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함