ft_strnstr.c - chanhl22/libft GitHub Wiki
1 /* ************************************************************************** */
2 /* */
3 /* ::: :::::::: */
4 /* ft_strnstr.c :+: :+: :+: */
5 /* +:+ +:+ +:+ */
6 /* By: chanhlee <[email protected].> +#+ +:+ +#+ */
7 /* +#+#+#+#+#+ +#+ */
8 /* Created: 2021/01/18 14:08:38 by chanhlee #+# #+# */
9 /* Updated: 2021/01/20 12:26:30 by chanhlee ### ########.fr */
10 /* */
11 /* ************************************************************************** */
12
13 #include "libft.h"
14
15 char *ft_strnstr(const char *big, const char *little, size_t len)
16 {
17 size_t little_len;
18 int i;
19
20 if (*little == '\0') // little가 NULL이라면 바로 big문자열 반환
21 return ((char *)big);
22 i = 0;
23 while (big[i] != '\0' && i < (int)(len - little_len))) // 널을 만나기 전까지 루프, 그리고 정해진 len안에서 루프를 반복하는 것이므로 i < len인데 여기서 같은 문자가 마지막에 있으면 문제가 생긴다.
24 {
25 if (big[i] == little[0]) // 만약 빅을 돌때 little과 같다면
26 if (!ft_strncmp(big + i, little, little_len)) //strncmp를 사용해서 0을 반환할지 아닐지 정함
27 return ((char *)(big + i)); //같다면 같은 문자열부터 반환
28 i++;
29 }
30 return (NULL); //아니라면 NULL
31 }
예를들어서
char big[] = "go go yogurt";
char little[] = "gu";
printf("return(gurt) : %s\n", strnstr(big,little,14)); // return(gurt) : gurt
printf("return(null) : %s\n", strnstr(big,little,9)); //return(null) : null
printf("return(gurt) : %s\n", strnstr(big,little,10)); //return(gurt) : gurt
9일때 null이 나와야한다. big문자열에서 9번째 자리는 'g'이고 i <= len까지 사용하면 g가 포함이 되어 'gurt'값이 나오게 된다. 그렇다면 여기서 마지막에 붙어있는 little를 제거해주기 위해서 우리는 little_len을 구해서 len에서 빼주게 된다.