Skip to content

37. 문자열 검색


1. 키워드

  • strchr(String Character)
  • strrchr(String (find from the Right) Character)
  • strstr(String (find) String)


2. 문자열 검색하기

  • 이번에는 문자열에서 문자와 문자열로 검색하는 방법을 알아보자.
  • 참고로 문자열 검색은 포인터를 이용하는 방식이라 내용이 어려울 수 있다.


3. 문자열 안에서 문자로 검색하기

  • 먼저 문자열에서 특정 문자로 검색하는 방법이다.
  • string.h 헤더 파일에 선언되어 있는 strchr 함수를 사용하면 문자열에서 특정 문자로 검색할 수 있다.


strchr(대상문자열, 검색할문자);
문자를 찾았으면 문자로 시작하는 문자열의 포인터를 반환, 문자가 없으면 NULL을 반환
#include <stdio.h>
#include <string.h> // strchr 함수가 선언된 헤더 파일

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

    char *ptr = strchr(s1, 'a'); // 'a'로 시작하는 문자열 검색, 포인터 반환

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

    return 0;
}

// arden Diary
// ary


  • strchr 함수에 문자열과 검색할 문자를 넣어주면 해당 문자로 시작하는 문자열의 위치(포인터)를 반환한다.


char *ptr = strchr(s1, 'a'); // 'a'로 시작하는 문자열 검색, 포인터 반환


  • 문자열 안에 'a'로 시작하는 부분을 더 찾으려면 while 반복문을 사용하여 검색된 문자열의 포인터를 strchr 함수에 계속 넣어서 반복한다.
  • NULL이 나오면 더이상 검색된 문자열이 없으므로 반복을 끝낸다.


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


  • 이제 strchr 함수의 동작 순서이다.
  • 먼저 char *ptr = strchr(s1, 'a');와 같이 처음 함수를 실행하여 "arden Diary"를 찾는다.
  • 그리고 while로 반복하면서 앞에서 결과로 나온 ptr1을 더하여 다시 넣어준다.


ptr = strchr(ptr + 1, 'a'); // 포인터에 1을 더하여 'a' 다음부터 검색


  • ptr을 그대로 넣어주면 "arden Diary"가 들어가서 맨 처음에 있는 'a'를 다시 찾게 되므로 계속 "arden Diary"가 나온다.
  • 따라서 포인터 연산으로 ptr1을 더해주면 "rden Diary"가 되므로 다음번 'a'를 찾을 수 있게 된다.


001


  • 여기서 "A Garden Diary"의 첫 글자가 'A'인데 그냥 넘어갔다.
  • 왜냐하면 strchr 함수는 대소문자를 구분하므로 검색할 문자를 'a'로 지정하면 'A'는 찾지 않고 넘어간다.
  • 다시 while로 반복하면서 'a'를 찾다가 문자열의 끝에서 NULL을 만나면 NULL을 반환한 뒤 반복문을 끝낸다.


002


4. 문자열의 오른쪽 끝부터 문자로 검색하기

  • strchr 함수는 문자열의 처음부터 문자를 검색해서 반환한다.
  • 하지만 string.h 헤더 파일에 선언되어 있는 strrchr 함수를 사용하면 문자열의 끝에서부터 문자를 검색할 수 있다.


strrchr(대상문자열, 검색할문자);
문자열의 끝에서부터 역순으로 검색해서 문자를 찾았으면 해당 문자로 시작하는 문자열의 포인터를 반환, 문자가 없으면 NULL을 반환
#include <stdio.h>
#include <string.h> // strrchr 함수가 선언된 헤더 파일

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

    char *ptr = strrchr(s1, 'a'); // 문자열 끝에서부터 'a'로 시작하는 문자열 검색, 포인터 반환

    printf("%s\n", ptr);

    return 0;
}

// ary


  • char *ptr = strrchr(s1, 'a');와 같이 strrchr 함수에 문자열과 검색할 문자를 넣어주면 문자열 끝에서부터 검색하여 'a'로 시작하는 문자열의 포인터를 반환한다.
  • "A Garden Diary"라면 "ary"의 포인터를 반환한다.
  • 즉, 가장 마지막에 있는 문자열을 찾는다.


003


  • 물론 strrchr 함수도 대소문자를 구분한다.


5. 문자열 안에서 문자열로 검색하기

  • 이번에는 문자열 안에서 문자열로 검색하는 방법을 알아보자.
  • string.h 헤더 파일에 선언되어 있는 strstr 함수를 사용하면 문자열 안에서 문자열을 검색할 수 있다.


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


  • 문자열에서 문자 찾기(strchr)와 문자열 찾기(strstr) 중에서 문자열 찾기 함수를 더 자주 쓴다.


#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);

    return 0;
}

// den Diary


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


004


  • strstr 함수도 대소문자를 구분한다.
  • strchr 함수처럼 strstr 함수도 while 반복문을 사용하여 문자열을 계속 검색할 수 있다.


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

References