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으로 올라가면서
처음의 자리를 카운팅 하게 됩니다.
'컴퓨터 프로그래밍 > C' 카테고리의 다른 글
C언어 함수 포인터 (0) | 2019.07.23 |
---|---|
C언어 문자열 처리 함수 (strchr() : 문자 검색) (0) | 2019.07.23 |
C언어 문자열 처리 함수 (strcmp() : 문자열 비교) (0) | 2019.07.23 |
C언어 문자열 처리 함수 (strcat() : 문자열 이어 붙이기) (0) | 2019.07.23 |
C언어 문자열 처리 함수 (strcpy() :문자열 복사) (0) | 2019.07.23 |