strstr, strnstr 함수 구현하기

윤효준·2024년 8월 4일
0

42 Libft 복습

목록 보기
18/28

strstr, strnstr 함수의 manual은 다음과 같다!

Synopsis

#include <string.h>

char	*strstr(const char *haystack, const char *needle);
char	*strnstr(const char *haystack, const char *needle, size_t len);
  • haystack: 검색할 대상이 되는 NULL로 종료된 문자열이다.
  • needle : 찾고자 하는 NULL로 종료된 문자열이다.
파라미터는 Finding a needle in a haystack 속담에서 유래한 거 같다.

Description

  • strstr 함수는 haystack 문자열에서 needle 문자열이 처음으로 나타나는 위치를 찾아 그 위치의 포인터를 반환한다.

  • strnstr 함수는 strstr 함수와 유사하지만 len 길이 안에서 탐색을 진행한다는 점이 다르다.

Return Values

  • needle이 빈 문자열일 경우, haystack을 반환한다.

  • needle 문자열이 haystack 내에서 발견되지 않으면 NULL을 반환한다.

  • 그렇지 않으면 needle 문자열이 처음으로 나타나는 위치를 반환한다.

구현

  • strstr 함수 구현
static int	ft_strcmp(const char *s1, const char *s2)
{
	while (*s1 != '\0' && *s1 == *s2)
	{
		s1++;
		s2++;
	}
	return ((unsigned char)(*s1) - (unsigned char)(*s2));
}

char	*ft_strstr(const char *haystack, const char *needle)
{
	if (*needle == '\0')
    	return ((char *) haystack);
	while (*haystack != '\0')
    {
    	if (ft_strcmp(haystack, needle) == 0)
        	return ((char *)haystack);
        haystack++;
    }
    return (NULL);
}
  • strnstr 함수 구현
static size_t	ft_strlen(const char *str)
{
	const char	*eos;

	eos = str;
	while (*eos != '\0')
		eos++;
	return (eos - str);
}

static int	ft_strncmp(const char *s1, const char *s2, size_t n)
{
    while (n > 0 && *s1 == *s2)
    {
        if (*s1 == '\0' && *s2 == '\0')
            break ;
        s1++;
        s2++;
        n--;
    }
    if (n == 0)
        return (0);
    return ((unsigned char)(*s1) - (unsigned char)(*s2));
}

char	*ft_strnstr(const char *haystack, const char *needle, size_t len)
{
	size_t	idx;
	size_t	needle_len;

	needle_len = ft_strlen(needle);
    if (needle_len == 0)
    	return ((char *) haystack);
    else if (needle_len > len)
    	return (NULL);
    idx = 0;
	while (*haystack != '\0' && idx + needle_len <= len)
	{
		if (ft_strncmp(haystack, needle, needle_len) == 0)
			return ((char *) haystack);
		haystack++;
		idx++;
	}
	return (NULL);
}
profile
작은 문제를 하나하나 해결하며, 누군가의 하루에 선물이 되는 코드를 작성해 갑니다.

0개의 댓글