1. strlen
size_t my_strlen(const char *s);
문자열의 길이를 구하는 함수
size_t my_strlen(const char *s)
{
size_t i;
i = 0;
while (s[i])
i++;
return (i);
}
- 해당 문자열의 끝을 의미하는
\0
값을 찾을때까지 길이를 구한다.
2. strlcpy
size_t my_strlcpy(char *dest, const char *src, size_t size);
src
에서 size만큼(\0
포함) 복사하는 함수
size_t my_strlcpy(char *dest, const char *src, size_t size)
{
const char *s;
size_t n;
s = src;
n = size; // n에 size 복사
if (!dest && !src)
return (0);
if (n != 0) // n이 0이 아닐때
{
while (--n != 0) // 널 값을 제외하고 복사하기 위해 n을 먼저 감소 시키고 반복
{
if ((*dest = *s) == '\0') // n을 다 돌기전에 널 값인경우 종료 (size가 src의 길이보다 긴 경우)
break ;
dest++;
s++;
}
}
if (n == 0) // 위에서 n이 다 돌았거나 size가 0인경우
{
if (size != 0) // n이 다 돌았으면 마지막에 널 값 넣어줌
*dest = '\0';
while (*s) // size가 0인경우 src의 길이를 반환하기 위함
s++;
}
return (s - src);
}
3. strlcat
size_t my_strlcat(char *dst, const char *src, size_t size);
dst
뒤에 src
의 값들을 n만큼 복사하는 함수
size_t my_strlcat(char *dst, const char *src, size_t size)
{
const char *s;
char *d;
size_t n;
size_t dlen;
s = src;
d = dst;
n = size;
while (n-- != 0 && *d != '\0')
d++;
dlen = d - dst;
n = size - dlen;
if (n == 0)
return (dlen + my_strlen(s));
while (*s != '\0')
{
if (n != 1)
{
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
return (dlen + (s - src));
}
4. strchr
char *my_strchr(const char *s, int c);
s
에서c
의 값을 찾아 해당 주소를 반환하는 함수
char *my_strchr(const char *s, int c)
{
char *ret;
ret = 0;
while (*s)
{
if (*s == (char)c)
return ((char *)s);
s++;
}
if (!c)
return ((char *)s);
return (ret);
}
5. strrchr
char *my_strrchr(const char *s, int c);
s
뒤에서부터c
의 값을 찾아 해당 주소를 반환하는 함수
char *my_strrchr(const char *s, int c)
{
char *ret;
ret = 0;
while (*s)
{
if (*s == (char)c)
ret = (char *)s;
s++;
}
if (!c)
return ((char *)s);
return (ret);
}
strchr
과 차이는c
값이 여러 개 일때 앞에서부터 탐색하여 찾자마자 그 주소를 반환하느냐, 마지막c
를 찾아서 그 주소를 반환하느냐의 차이이다.
6. strnstr
char *my_strnstr(const char *big, const char *little, size_t len);
특정 문자열을 찾아 그 문자열이 시작하는 주소를 반환하는 함수
char *my_strnstr(const char *big, const char *little, size_t len)
{
size_t llen;
size_t blen;
size_t i;
if (!*little)
return ((char *)big);
llen = my_strlen(little);
blen = my_strlen(big);
i = 0;
if (blen < llen || len < llen)
return (0);
while (i + llen <= len)
{
if (big[i] == *little && !my_strncmp(big + i, little, llen))
return ((char *)big + i);
i++;
}
return (0);
}
7. strncmp
int my_strncmp(const char *s1, const char *s2, size_t n);
s1
이 가리키는 처음 n
바이트의 데이터와 s2
가 가리키는 처음 n
바이트의 데이터를 비교하는 함수
int my_strncmp(const char *s1, const char *s2, size_t n)
{
while (n--)
{
if (*s1 != *s2)
return (*(unsigned char *)s1 - *(unsigned char *)s2);
if (*s1)
s1++;
if (*s2)
s2++;
}
return (0);
}
- 비교대상의 차이를 반환
1. strlen
size_t my_strlen(const char *s);
문자열의 길이를 구하는 함수
size_t my_strlen(const char *s)
{
size_t i;
i = 0;
while (s[i])
i++;
return (i);
}
- 해당 문자열의 끝을 의미하는
\0
값을 찾을때까지 길이를 구한다.
2. strlcpy
size_t my_strlcpy(char *dest, const char *src, size_t size);
src
에서 size만큼(\0
포함) 복사하는 함수
size_t my_strlcpy(char *dest, const char *src, size_t size)
{
const char *s;
size_t n;
s = src;
n = size; // n에 size 복사
if (!dest && !src)
return (0);
if (n != 0) // n이 0이 아닐때
{
while (--n != 0) // 널 값을 제외하고 복사하기 위해 n을 먼저 감소 시키고 반복
{
if ((*dest = *s) == '\0') // n을 다 돌기전에 널 값인경우 종료 (size가 src의 길이보다 긴 경우)
break ;
dest++;
s++;
}
}
if (n == 0) // 위에서 n이 다 돌았거나 size가 0인경우
{
if (size != 0) // n이 다 돌았으면 마지막에 널 값 넣어줌
*dest = '\0';
while (*s) // size가 0인경우 src의 길이를 반환하기 위함
s++;
}
return (s - src);
}
3. strlcat
size_t my_strlcat(char *dst, const char *src, size_t size);
dst
뒤에 src
의 값들을 n만큼 복사하는 함수
size_t my_strlcat(char *dst, const char *src, size_t size)
{
const char *s;
char *d;
size_t n;
size_t dlen;
s = src;
d = dst;
n = size;
while (n-- != 0 && *d != '\0')
d++;
dlen = d - dst;
n = size - dlen;
if (n == 0)
return (dlen + my_strlen(s));
while (*s != '\0')
{
if (n != 1)
{
*d++ = *s;
n--;
}
s++;
}
*d = '\0';
return (dlen + (s - src));
}
4. strchr
char *my_strchr(const char *s, int c);
s
에서c
의 값을 찾아 해당 주소를 반환하는 함수
char *my_strchr(const char *s, int c)
{
char *ret;
ret = 0;
while (*s)
{
if (*s == (char)c)
return ((char *)s);
s++;
}
if (!c)
return ((char *)s);
return (ret);
}
5. strrchr
char *my_strrchr(const char *s, int c);
s
뒤에서부터c
의 값을 찾아 해당 주소를 반환하는 함수
char *my_strrchr(const char *s, int c)
{
char *ret;
ret = 0;
while (*s)
{
if (*s == (char)c)
ret = (char *)s;
s++;
}
if (!c)
return ((char *)s);
return (ret);
}
strchr
과 차이는c
값이 여러 개 일때 앞에서부터 탐색하여 찾자마자 그 주소를 반환하느냐, 마지막c
를 찾아서 그 주소를 반환하느냐의 차이이다.
6. strnstr
char *my_strnstr(const char *big, const char *little, size_t len);
특정 문자열을 찾아 그 문자열이 시작하는 주소를 반환하는 함수
char *my_strnstr(const char *big, const char *little, size_t len)
{
size_t llen;
size_t blen;
size_t i;
if (!*little)
return ((char *)big);
llen = my_strlen(little);
blen = my_strlen(big);
i = 0;
if (blen < llen || len < llen)
return (0);
while (i + llen <= len)
{
if (big[i] == *little && !my_strncmp(big + i, little, llen))
return ((char *)big + i);
i++;
}
return (0);
}
7. strncmp
int my_strncmp(const char *s1, const char *s2, size_t n);
s1
이 가리키는 처음 n
바이트의 데이터와 s2
가 가리키는 처음 n
바이트의 데이터를 비교하는 함수
int my_strncmp(const char *s1, const char *s2, size_t n)
{
while (n--)
{
if (*s1 != *s2)
return (*(unsigned char *)s1 - *(unsigned char *)s2);
if (*s1)
s1++;
if (*s2)
s2++;
}
return (0);
}
- 비교대상의 차이를 반환