#include <unistd.h>

char	*ft_strstr(char *str, char *to_find)
{
	if (*to_find == '\\0')
	{
		return ('\\0');
	}
	while ((*str != *to_find) && (*str != '\\0'))
	{
		str++;
	}
	if (*str != *to_find)
	{
		return ('\\0');
	}
	return (str);
}

#include <stdio.h>
#include <string.h>

int main(void)
{
	char a[] = "adddfdfd";
	char b[] = "addd";

	printf("%s", ft_strstr(a, b));
}

[C/C++]NULL, NUL, 0, \0 의 차이점을 알아보자.

처음에 널문자를 리턴하게 했을 때 ‘\0’을 썼는데, 컴파일 과정에서 오류가 발생했다.

그래서 처음엔 함수 형식이 배열을 리턴하는 것이니 문자가 아닌 배열을 써야겠다고 생각해서 “\0”을 사용했는데 알고 보니 ‘\0’과 “\0”은 다른 것이었다.

"\0"의 경우 큰따옴표를 사용하므로 문자열이기 때문에, 이 문자열의 첫번째 주소를 지시하는 변수에 널 값이 아닌 주소 값이 들어있고, '\0'의 경우엔 그냥 아스키 코드 값인 0이 들어있기에 이 둘은 다르다고 말씀해주셨습니다. 그리고 4번 문제의 경우, 함수가 문자열을 리턴하는 함수(char *)이기 때문에, '\0' 을 쓰는 것은 애초에 잘못된 것이고, "\0"을 리턴하는 것도 널 값이 아닌 주소를 리턴하는 것이라, 널 값을 리턴하려면 그냥 0을 써야한다고 합니다.

위 인용문은 내가 알게 된 것을 평가자님께도 알려드린 것이다.

직접 시연해보니 strstr 함수에서 dest가 없을 때에는 null값을 출력하고 to_find가 없을 때에는 dest문자열 전체를 출력한다.

수정한 코드

#include <unistd.h>

char	*ft_strstr(char *str, char *to_find)
{
	int	i;

	if (*to_find == '\\0')
	{
		return (str);
	}
	while ((*str != '\\0')) //문자열이 널문자가 아닐 때까지 반복
	{
		i = 0; // i = 0으로 초기화
		while (str[i] == to_find[i]) // str[i]와 to_find[i]가 일치하는 동안
		{
			i++; //i를 증가시킨다.
			if (to_find[i] == '\\0') // 만약 계속 일치해서 to_find[i]가 널문자에 닿으면
				return (str); //이동한만큼부터의 str주소를 리턴.
		}
		str++; // 일치하지 않는다면 str의 주소값을 증가시킴.
	}
	return (0); // 그리고 결국 일치하지 않는다면 null을 리턴한다.
}
/*
#include <stdio.h>
#include <string.h>

int main(void)
{
	char hay[] = "abfdfjdbb";
	char needle[] = "bb";
	printf("%s\\n", strstr(hay, needle));
	printf("%s\\n", ft_strstr(hay, needle));
}*/

처음에 i = 0을 첫 번째 while문 위에 넣었는데, 알고 보니 문자열을 비교하다가 일치하지 않으면 to_find의 주소를 다시 처음으로 리셋해야 했다. 그래서 i = 0을 두 번째 while문 위로 옮겼다.

[실습] strstr 함수 만들기 - Step1