티스토리 뷰

728x90
반응형

틀린 내용이나 지식이 있다면 댓글로 알려주세요! 감사합니다!

💡 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함수strncpystrncat은 올바르게 사용하기 어렵고 느리게 만드는 결함을 가지고 있다. strlcpystrlcat 은 올바른 사용법이 가능한 한 간단하도록 설계되었다.

  • 이해하기 쉽게는 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을 뺀 길이로 계산한다.
  • destsizedest의 크기보다 작을 때, strlen(src) + size 를 반환한다.
  • destsizedest의 크기보다 클 때, strlen(src) + strlen(dst)를 반환한다.
  • 처음에 굉장히 헷갈렸던 부분이 destsize이다. destdestsize보다 큰 경우는 destsize 크기를 벗어나기 때문에 문자열을 이어붙일 수가 없다. 따라서 연결작업은 건너 뛰고 return (destlen + srclen) 해준다고 생각하면 된다.
  • 즉, destsize10이지만 dest의 문자열의 길이가 4인 경우 src의 문자열은 6이 들어갈 수 있다. 반면 destsize10이지만 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 :

wonllism : n 과 l의 차이

모두의 코드 106

strlcat에 대하여

 

 

728x90
반응형
댓글