Programming/C

strchr & strstr 함수로 문자(열) 검색하기

moxie2ks 2025. 4. 19. 18:01
728x90
반응형

개요

C 언어 문자열 처리에서 문자나 문자열을 검색하는 기능은 텍스트 처리의 핵심 요소이다. C 표준 라이브러리는 이러한 작업을 효율적으로 수행하기 위한 strchr와 strstr 함수를 제공한다. strchr 함수는 문자열 내에서 특정 문자를 검색하고, strstr 함수는 문자열 내에서 부분 문자열을 검색한다. 이 두 함수는 문자열 조작과 텍스트 파싱에 필수적인 도구로, C 프로그래밍에서 광범위하게 활용된다.

설명

두 함수는 모두 string.h 헤더 파일에 선언되어 있으며, C 표준 라이브러리의 일부이다.

strchr 함수

char* strchr(const char* str, int c);
  • 문자열 str에서 문자 c의 첫 번째 출현을 검색한다.
  • 문자 c는 정수형 매개변수로 전달되지만, 내부적으로는 char 타입으로 변환되어 처리된다.
  • 문자 c가 문자열 내에 존재하면 해당 문자가 위치한 포인터를 반환한다.
  • 문자 c가 문자열 내에 존재하지 않으면 NULL 포인터를 반환한다.

strstr 함수

char* strstr(const char* str, const char *strSearch);
  • 문자열 str 내에서 부분 문자열 strSearch의 첫 번째 출현을 검색한다.
  • 부분 문자열 strSearch가 문자열 str 내에 존재하면, strSearch가 시작하는 위치의 포인터를 반환한다.
  • 부분 문자열 strSearch가 문자열 str 내에 존재하지 않으면 NULL 포인터를 반환한다.
  • 빈 문자열 strSearch(즉, "")를 검색할 경우, 원본 문자열 str의 포인터를 반환한다.

특징

strchr 함수의 특징

  1. 효율성: 단일 문자 검색은 매우 빠르게 수행된다.
  2. 대소문자 구분: C 언어의 문자 비교는 기본적으로 대소문자를 구분한다.
  3. 널 종료 문자 포함: strchr는 널 종료 문자('\0')도 검색 가능하다.
  4. 연속 검색: 반환된 포인터를 이용하여 동일한 문자의 다음 출현을 검색할 수 있다.
  5. 메모리 안전성: 입력 문자열이 올바르게 널로 종료되어야 한다.

strstr 함수의 특징

  1. 부분 문자열 검색: 연속된 여러 문자를 한 번에 검색할 수 있다.
  2. 속도: 단일 문자 검색보다는 느릴 수 있으나, 대부분의 구현은 최적화되어 있다.
  3. 대소문자 구분: strchr와 마찬가지로 대소문자를 구분한다.
  4. 빈 문자열 처리: 빈 문자열을 검색하면 원본 문자열의 시작 포인터를 반환한다.
  5. 연속 검색: 반환된 포인터를 이용하여 다음 부분 문자열을 검색할 수 있다.

예시

strchr 함수 사용 예시

다음은 문자열 내에서 특정 문자 'o'의 모든 출현을 찾는 예시이다:

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

int main(void)
{
    char str[] = "BlockDMask Blog is good";
    char* ptr = str;
    int count = 0;

    while ((ptr = strchr(ptr, 'o')) != NULL)
    {
        printf("찾은 문자: %c, 위치: %ld, 문자열: %s\n", 
               *ptr, ptr - str, ptr);
        ptr++; // 다음 위치로 이동
        count++;
    }

    printf("총 %d개의 'o' 문자를 찾았습니다.\n", count);

    return 0;
}

위 코드의 실행 결과는 다음과 같다:

찾은 문자: o, 위치: 2, 문자열: ockDMask Blog is good
찾은 문자: o, 위치: 12, 문자열: og is good
찾은 문자: o, 위치: 16, 문자열: ood

strstr 함수 사용 예시

다음은 문자열 내에서 부분 문자열 "World"의 모든 출현을 찾는 예시이다:

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

int main()
{
    char str[] = "Hello World Welcome to the World My World";
    char* ptr = str;
    char* search = "World";
    int count = 0;
    
    while ((ptr = strstr(ptr, search)) != NULL)
    {
        printf("찾은 위치: %ld, 문자열: %s\n", ptr - str, ptr);
        ptr += strlen(search); // 검색된 문자열 다음 위치로 이동
        count++;
    }

    printf("총 %d개의 '%s' 문자열을 찾았습니다.\n", count, search);

    return 0;
}

위 코드의 실행 결과는 다음과 같다:

찾은 위치: 6, 문자열: World Welcome to the World My World
찾은 위치: 25, 문자열: World My World
찾은 위치: 34, 문자열: World
총 3개의 'World' 문자열을 찾았습니다.

결론

strchr와 strstr 함수는 C 언어에서 문자열 처리를 위한 강력하고 효율적인 도구이다. strchr는 단일 문자 검색에 최적화되어 있으며, strstr는 부분 문자열 검색에 적합하다. 두 함수 모두 검색 결과로 포인터를 반환하므로, 검색된 위치에서부터 문자열을 조작하거나 추가 검색을 수행하는 데 유용하다.

이러한 함수들은 텍스트 파싱, 구문 분석, 데이터 추출 등 다양한 문자열 관련 작업에서 필수적이다. 그러나 메모리 안전성을 보장하기 위해 항상 널로 종료된 문자열을 사용해야 하며, 반환값이 NULL일 수 있는 가능성을 항상 고려해야 한다.

더 복잡한 문자열 검색 요구사항(대소문자 구분 없는 검색, 정규 표현식 등)에는 추가적인 라이브러리나 사용자 정의 함수가 필요할 수 있지만, strchr와 strstr는 기본적인 문자열 검색 작업에 있어 견고하고 효율적인 솔루션을 제공한다.

참고문헌

  1. [C언어/C++] strchr 함수(문자 검색)에 대해서: https://blockdmask.tistory.com/389
  2. [C언어/C++] 특정 문자열 찾기/검색 &치환 strstr 함수 사용법 & 예제: https://coding-factory.tistory.com/677
  3. C 표준 라이브러리 문서 - strchr: https://en.cppreference.com/w/c/string/byte/strchr
  4. C 표준 라이브러리 문서 - strstr: https://en.cppreference.com/w/c/string/byte/strstr

 

728x90
반응형