39.3 문자열 안에서 문자열로 검색하기

이번에는 문자열 안에서 문자열로 검색하는 방법을 알아보겠습니다. strstr 함수는 문자열 안에서 문자열을 검색하며 string (find) string에서 따왔습니다(string.h 헤더 파일에 선언되어 있습니다).

  • strstr(대상문자열, 검색할문자열);
    • char *strstr(char * const _String, char const * const _SubString);
    • 문자열을 찾았으면 문자열로 시작하는 문자열의 포인터를 반환, 문자열이 없으면 NULL을 반환

문자열에서 문자 찾기(strchr)와 문자열 찾기(strstr) 중에서 어떤 함수를 자주 쓸까요? 실제로 워드나 메모장에서 검색을 할 때 문자보다는 단어로 검색하는 경우가 많습니다. 그러다 보니 프로그램을 만들 때도 문자열 찾기 함수를 더 자주 씁니다.

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

string_find_string.c

#include <stdio.h>
#include <string.h>    // strstr 함수가 선언된 헤더 파일

int main()
{
    char s1[30] = "A Garden Diary";     // 크기가 30인 char형 배열을 선언하고 문자열 할당

    char *ptr = strstr(s1, "den");      // den으로 시작하는 문자열 검색, 포인터 반환

    printf("%s\n", ptr);    // den Diary

    return 0;
}

실행 결과

den Diary

char *ptr = strstr(s1, "den");와 같이 strstr 함수에 문자열과 검색할 문자열을 넣어주면 해당 문자열로 시작하는 문자열의 위치(포인터)를 반환합니다.여기서는 "A Garden Diary"에서 "den"로 시작하는 문자열을 찾으므로 "den Diary"가 나옵니다. 즉, 검색한 문자 "den"만 나오지 않고 뒤에 오는 모든 문자열이 나옵니다(NULL이 나오기 전까지).

그림 39‑4 strstr 함수로 문자열 검색

strstr 함수도 대소문자를 구분합니다.

strchr 함수처럼 strstr 함수도 while 반복문을 사용하여 문자열을 계속 검색할 수 있습니다.

string_find_string_while.c

char s1[100] = "A Garden Diary A Garden Diary A Garden Diary";

char *ptr = strstr(s1, "den");     // den으로 시작하는 문자열 검색, 포인터 반환

while (ptr != NULL)                // 검색된 문자열이 없을 때까지 반복
{
    printf("%s\n", ptr);           // 검색된 문자열 출력
    ptr = strstr(ptr + 1, "den");  // den 포인터에 1을 더하여 e부터 검색
}

실행 결과

den Diary A Garden Diary A Garden Diary
den Diary A Garden Diary
den Diary

지금까지 문자열 검색 방법을 배웠는데 포인터를 이용하는 방식이라 내용이 다소 어려웠습니다. 여기서 함수의 동작 방식까지 모두 이해할 필요는 없습니다. 나중에 문자열 검색이 필요할 때 다시 돌아와서 찾아보세요.