열렬히.뛰기

ft_strnstr

école 42 > libft > ft_strnstr

문제

문자열 haystack에 길이 len 이내에 needle이 있는지 검사하는 함수.

찾았다면, 찾은 지점의 pointer를 반환

구현

  1. haystack을 반복문으로 돌린다.
  2. haystack[i]가 needle[0]과 같다면,
    • haystack[i + temp]가 needle[temp]와 같은지 확인
      • 하나라도 같지 않으면 다음으로 넘어간다.
    • i + temp가 주어진 길이를 초과하는지도 확인
      • 주어진 길이를 초과할 경우, 조심해야 한다.
    • 만약 needle[temp]까지 다 맞다면, haystack[i]의 주소를 반환한다.
  3. 아무리 해도 같은 것이 없다면, (void *)0 반환

주의할 점

  • needle이 공백이 경우를 생각해야 한다.
  • 또, 길이가 0인 경우도 생각해야 한다.

코드

c
#include "libft.h"

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

	i = 0;
	if (needle[0] == '\0')
		return(&((char *)haystack)[0]);
	while (haystack[i] && i < len)
	{
		tmp = 0;
		if (needle[tmp] == '\0')
			return (&((char *)haystack)[i]);
		if (haystack[i + tmp] == needle[tmp])
		{
			while (haystack[i + tmp] && needle[tmp])
			{
				if (needle[tmp] != haystack[i + tmp])
					break ;
				else if (i + tmp >= len)
					break ;
				tmp++;
			}
			if (needle[tmp] == '\0')
				return (&((char *)haystack)[i]);
		}
		i++;
	}
	return (NULL);
}