42Seoul/Libft

[C] 나만의 라이브러리 - substr, strjoin, strtrim, itoa

  • -
728x90

1. substr

함수 형태

char    *my_substr(char const *s, unsigned int start, size_t len);

매개 변수

  • 원본 문자열
  • 문자열 s에 있는 하위 문자열의 시작점
  • 하위 문자열의 길이

반환 값

잘라낸 문자열, 실패시 NULL 반환

설명

malloc(3)를 사용하여 할당하고 문자열 's'에서 하위 문자열을 반환. 하위 문자열은 인덱스 'start'에서 시작되며 최대 크기 'len'

소스 코드

#include "libmy.h"

char    *my_substr(char const *s, unsigned int start, size_t len)
{
    size_t    i;
    size_t    len_s;
    char    *ret;

    if (!s)
        return (0);
    if (!(ret = (char *)malloc(sizeof(char) * len + 1)))
        return (0);
    len_s = my_strlen(s);
    i = 0;
    while (i < len && start + i < len_s)
    {
        ret[i] = s[start + i];
        i++;
    }
    ret[i] = 0;
    return (ret);
}

2. strjoin

함수 형태

char    *my_strjoin(char const *s1, char const *s2);

매개 변수

  • 접두사 문자열
  • 접미사 문자열

반환 값

이어 붙인 새 문자열, 실패 시 NULL 반환

설명

malloc(3)를 할당하고 새 문자열을 반환하며, 이는 's1'과 's2'를 연결한 결과물

소스 코드

#include "libmy.h"

char    *my_strjoin(char const *s1, char const *s2)
{
    size_t    len_s1;
    size_t    len_s2;
    char    *ret;

    if (!s1 || !s2)
        return (0);
    len_s1 = my_strlen(s1);
    len_s2 = my_strlen(s2);
    if (!(ret = (char *)malloc(sizeof(char) * (len_s1 + len_s2 + 1))))
        return (0);
    my_memcpy(ret, s1, len_s1);
    my_memcpy(ret + len_s1, s2, len_s2);
    ret[len_s1 + len_s2] = 0;
    return (ret);
}

반환할 메모리에 접두사 문자열을 복사하고, 그 뒤에 접미사 문자열을 복사한 후 마지막에 '\0'값을 넣는다.

3. strtrim

함수 형태

char        *my_strtrim(char const *s1, char const *set);

매개 변수

  • 원본 문자열
  • 제거할 참조 문자열

반환 값

s1에서 찾은 set에 포함된 문자들을 양 끝에서 제거한 후 결과 문자열, 할당 실패 시 NULL 반환.

설명

malloc(3)를 사용하여 할당하고 문자열의 처음과 끝에서 'set'에 지정된 문자가 제거된 's1' 복사본을 반환

소스 코드

char        *my_strtrim(char const *s1, char const *set)
{
    size_t    start;
    size_t    end;
    char    *res;

    if (!s1)
        return (NULL);
    if (!set)
        return (my_strdup(s1));
    start = 0;
    end = my_strlen(s1);
    while (s1[start] && my_strchr(set, s1[start]))
        start++;
    while (s1[end - 1] && my_strchr(set, s1[end - 1]))
    {
        if (end - 1 < 1)
            break ;
        end--;
    }
    if (start > end)
        return (my_strdup(""));
    if (!(res = (char *)malloc(sizeof(char) * (end - start + 1))))
        return (NULL);
    my_strlcpy(res, s1 + start, end - start + 1);
    return (res);
}

주의해야할 점은 원본 문자열 전체가 set에 포함되는 문자일 때이다.

우선 앞에서 문자들을 지우고, '\0''을 제외하고 뒷부분부터 탐색을 한다. 이 때 end 값이 start 보다 작아진다면 원본 문자열에 지워야할 문자를 제외하면 없다는 뜻이므로, '\0' 값을 할당하여 반환한다.

그렇지 않으면 지우고난 후 end - start + 1하여 '\0'값 포함한 길이 만큼 할당하여 결과를 복사하여 반환한다.

4. itoa

함수 형태

char            *my_itoa(int n);

매개 변수

  • 변환할 정수

반환 값

정수를 나타내는 문자열, 할당 실패 시 NULL 반환

설명

malloc(3)를 사용하여 할당하고 인수로 받은 정수를 나타내는 문자열을 반환한다. 음수는 반드시 처리해야 한다.

소스 코드

static int        my_get_len(int n)
{
    int    len;

    len = (n <= 0) ? 1 : 0;
    while (n)
    {
        n /= 10;
        len++;
    }
    return (len);
}

char            *my_itoa(int n)
{
    int            len;
    int            sign;
    char        *ret;
    long long    tmp;

    sign = n < 0 ? -1 : 1;
    len = my_get_len(n);
    if (!(ret = (char *)malloc(sizeof(char) * len + 1)))
        return (NULL);
    ret[len] = 0;
    len--;
    tmp = n < 0 ? -(long long)n : (long long)n;
    while (len >= 0)
    {
        ret[len] = '0' + tmp % 10;
        tmp /= 10;
        len--;
    }
    if (sign == -1)
        ret[0] = '-';
    return (ret);
}
728x90
300x250
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.