Unborn 8.0 Yellow Pointer
본문 바로가기
42 SEOUL/0_Libft

[Libft] Part1 : strlen, strnstr, strlcpy, strlcat, strchr, strrchr, strncmp

by 에삐니 2022. 3. 26.
728x90

[이전 글]

 

[Libft] 나만의 첫 번째 라이브러리

1. 프로젝트 소개 C 프로그래밍을 할 때 매우 유용한 표준 함수들을 사용할 수 없다면 굉장히 지루할 거예요. 이 프로젝트를 통해 이러한 표준 함수들을 구현하고, 이해하고, 어떻게 사용하는지

bini-079.tistory.com

[다음 글]

 

[Libft] Part2 : Additional functions

삐니의 소소한 일상 [Libft] Part2 : Additional functions 본문 42 SEOUL/Libft [Libft] Part2 : Additional functions 에삐니 2022. 3. 24. 01:22 Prev 1 2 3 4 5 6 7 8 9 ··· 104 Next

bini-079.tistory.com


Part1 : Libc functions

아래의 함수들을 다시 구현하세요. 이 함수들은 외부 함수를 필요로 하지 않습니다 :

  • isalpha, isdigit, isalnum, isascii, isprint
  • bzero, memset, memcpy, memmove, memchr, memcmp
  • strlen, strnstr, strlcpy, strlcat, strchr, strrchr, strncmp
  • toupper, tolower, atoi

다음의 함수들은 외부 함수 malloc을 사용하여 구현하세요 :

  • calloc, strdup

ft_strlen

size_t	strlen(const char *str)
{
	size_t i;

	i = 0;
	while (str[i])
		i++;
	return (i);
}
  • 문자열의 길이를 구하는 함수이다.
  • 문자열의 시작부터 널 문자 직전가지의 문자의 개수를 구한다.

 

ft_strnstr

char	*ft_strnstr(const char *haystack, const char *needle, size_t len)
{
	size_t	i;
	size_t	j;

	if (!needle[0])
    		return ((char *)haystack);
	i = 0;
	while (haystack[i] && i < len)
	{
    		j = 0;
		while (i + j < len && haystack[i + j] == needle[j])
		{
        		j++;
			if (!needle[j])
				return ((char *)(haystack + i));
		}
		i++;
	}
	return (0);
}
  • 문자열 내에서 부분 문자열을 탐색하는 함수이다.
  • haystack 문자열의 시작부터 len까지 needle문자열이 포함되어 있는지 확인한다.
  • 포함되어 있을 경우, haystack문자열에서 needle문자열이 시작한 부분의 위치 주소를 반환한다.
  • needle 문자열의 값이 비어있으면 haystack의 주소 첫 번째 값을 반환한다.
  • needle 문자열을 찾지 못하면 null 값을 반환한다.

 

ft_strlcpy

size_t	ft_strlcpy(char *dst, const char *src, size_t dstsize)
{
	size_t	i;
	size_t	len_src;

	len_src = ft_strlen(src);
	if (!dstsize)
		return (len_src);
	i = 0;
	while (i + 1 < dstsize && src[i])
	{
		dst[i] = src[i];
		i++;
	}
	dst[i] = 0;
	return (len_src);
}
  • null을 보장하면서 문자열을 복사하는 함수이다.
  • src의 길이를 반환한다.
반응형

ft_strlcat

size_t	ft_strlcat(char *dest, const char *src, size_t dstsize)
{
	size_t	i;
	size_t	len_des;
	size_t	len_src;

	len_des = ft_strlen(dest);
	len_src = ft_strlen(src);
	i = 0;
	while (src[i] && len_des + i + 1 < dstsize)
	{
		dest[len_des + i] = src[i];
		i++;
	}
	if (len_des > dstsize)
		return (dstsize + len_src);
	dest[len_des + i] = 0;
	return (len_des + len_src);
}
  • null을 보장하여 문자열을 이어 붙이는 함수이다.
  • size - 1만큼 dst 뒤에 src를 이어 붙이며 size의 크기에 따라 반환하는 값이 나뉜다.
  • size > dst : len_dst + len_src 길이를 반환한다.
  • size < dst : size + len_src 길이를 반환한다.

ft_strchr

char	*ft_strchr(const char *s, int c)
{
	int	i;

	i = -1;
	while (s[++i])
		if (s[i] == c)
			return ((char *)s + i);
	if (!c)
		return ((char *)s + i);
	return (0);
}
  • 문자열에서 특정 문자로 검색하는 함수이다.
  • 해당 문자로 시작하는 문자열의 주소의 값을 반환하고, 없으면 null을 반환한다.
  • 이때, null문자도 비교 가능하도록 예외처리를 해준다.

 

ft_strrchr

char	*ft_strrchr(const char *s, int c)
{
	int	i;

	i = ft_strlen(s);
	while (i >= 0)
	{
		if (s[i] == (char)c)
			return ((char *)&s[i]);
		i--;
	}
	return (0);
}
  • 문자열에서  특정 문자를 검색하여 가장 마지막으로 나타난 위치를 검색하는 함수이다.
  • 해당 문자로 끝나는 문자열의 주소의 값을 반환하고, 없으면 null을 반환한다.
  • 이때, null문자도 비교 가능하도록 예외 처리해준다.

 

ft_strncmp

int	ft_strncmp(const char *s1, const char *s2, size_t n)
{
	size_t	i;

	i = 0;
	while (i < n)
	{
		if ((s1[i] != s2[i]) || !s1[i] || !s2[i])
			return ((unsigned char)s1[i] - (unsigned char)s2[i]);
		i++;
	}
	return (0);
}
  • 두 문자열의 내용을 비교하는 함수입니다.
  • 비교는 처음부터 n바이트까지 혹은 일치하지 않거나 null문자를 만났을 때까지만 비교한다.
  • 모두 일치한다면 0을 반환한다.
  • 최초로 일치하지 않는 문자가 발생할 경우,
    • s1 > s2 : 양수 값을 반환한다.
    • s1 < s2 : 음수 값을 반환한다.
  • strcmp와 같은 방식이나 다른 문자가 나타나거나 null을 만나면 종료하고 값을 반환하는 차이점이 있다.
  • 값을 반환할 때, 128 이상의 아스키코드 수를 계산할 경우를 위해 unsigned char형으로 변환했다.

 

728x90
반응형

댓글