44 문자열 검색하기

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

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

먼저 문자열에서 특정 문자로 검색하는 방법입니다. strchr 함수를 사용하면 문자열에서 특정 문자로 검색할 수 있으며 함수 이름은 string character에서 따왔습니다(string.h 헤더 파일에 선언되어 있습니다).

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

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

string_find_character.c

#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로 반복하면서 앞에서 결과로 나온 ptr에 1을 더하여 다시 넣어줍니다.

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

ptr을 그대로 넣어주면 "arden Diary"가 들어가서 맨 처음에 있는 'a'를 다시 찾게 되므로 계속 "arden Diary"가 나옵니다. 따라서 포인터 연산으로 ptr에 1을 더해주면 "rden Diary"가 되므로 다음번 'a'를 찾을 수 있게 됩니다(포인터 연산은 'Unit 59 포인터 연산 사용하기'에서 자세히 설명하겠습니다).

그림 44‑1 strchr 함수로 문자 검색 1

여기서 "A Garden Diary"의 첫 글자가 A인데 그냥 넘어갔습니다. 왜냐하면 strchr 함수는 대소문자를 구분하므로 검색할 문자를 'a'로 지정하면 'A'는 찾지 않고 넘어갑니다.

다시 while로 반복하면서 'a'를 찾다가 문자열의 끝에서 NULL을 만나면 NULL을 반환한 뒤 반복문을 끝냅니다.

그림 44-2 strchr 함수로 문자 검색 2