컴퓨터 프로그래밍/C

C언어 문자열 처리 함수 (strstr() : 문자열 검색)

나노콛 2019. 7. 23. 11:42

strstr() 문자열 검색 함수

 

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

int main()
{
	char string[20] = "apapple";
	char* search = "app";
	char* result = NULL;

	result = strstr(string,search);
	
	printf("string Addr : %p \n", string);
	printf("result Addr : %p \n", result);
	printf("result : %s \n", result);

	return 0;
}

strstr()는 문자열 내에서 특정 문자열을 검색하는 함수입니다.

인자는 2개 문자열 주소가 들어갑니다.
문자열을 찾았다면 해당 문자열이 포함된 첫 글자의 주소가 반환됩니다.
app가 같으니 apple까지 반환됩니다.
pp를 찾는다면 pple까지 반환됩니다.

못 찾았다면 null이 반환됩니다.


strstr() 직접 구현해보기

1. 리턴 타입
2. 인자 형태
3. 기능 구현 

 

리턴 타입은 성공시 찾으려는 문자열의 첫 글자의 주소를 반환하기 때문에
char *형이 필요합니다.

인자 형태는
문자열 주소 2개 필요합니다.

 

char * MyStrstr(char * string, char * search)
{

}

기능 구현에 대해 생각해본다면

문자열을 null까지 반복하면서
찾으려는 문자열을 서로 비교하면 되겠지요
만약에 찾는 도중 문자열이 같지 않다면
* 찾으려는 문자열의 주소를 다시 시작 주소로 변경이 되어야 합니다

그리고 찾으려는 문자열의 값이 널 문자까지 왔다면 다 찾았다는 것이겠죠
같은 문자열을 찾을 때마다 카운터를 하나씩 늘려서
어느 위치에 있는지 파악을 해줄 필요가 있습니다.

그 이유는
app를 찾았는데 
주소를 변경하면서 찾기 때문에
찾을 대상의 주소가 (app) le 차례가 되어버리기 때문입니다.

그래서 찾았다면 카운터를 하나씩 늘려서 반환을 해줄 때
카운터만큼 빼주면 해결을 할 수 있습니다.

 

char * MyStrstr(char * string, char * search)
{
	char * tmp = search;  //search의 주소를 tmp에 저장
	int cnt = -1;  //카운터를 -1로 초기화 이유는 아래에 쓸게요
	while (*string)  //string의 값이 null문자 전까지 반복
	{
		if (*string != *search) //string의 값이 search의 값과 다르면
		{
			cnt = -1;  //카운터 다시 초기화
			search = tmp;  //search의 주소도 처음 주소로 변경
        }

		if (*string == *search) //string의 값이 search의 값과 같다면
		{
			search++;  //search의 주소 증가
			cnt++;   //카운터 증가
			if (*search == '\0') //search의 값이 null이 라면
			{
				return string - cnt; //string의 현재 주소에서 cnt만큼을 뺀 주소를 반환
			}
		}
        string++; // string의 주소를 증가
		if (*string == '\0') //null을 만나면 (못찾았다는 증거)
		{
			return 0;  // 못찾았다면 0 반환 (null)
		}
	}
}

cnt의 값을 -1로 초기화하는 이유는
문자열의 주소는 0부터 시작하기 때문입니다.
만약에 0으로 초기화했다면
a를 찾았을 때 1이 되어버려서
잘못된 결과가 나오게 됩니다.
처음 찾았을 때 -1이 0으로 올라가면서
처음의 자리를 카운팅 하게 됩니다.