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에서 빼주게 된다.