Core Programming/C Standard Library: Resource & Performan

C언어 문자열 검색 완벽 가이드: strchr과 strstr 함수 사용법 및 차이점

임베디드 친구 2025. 2. 12. 09:23
반응형

C언어에서 텍스트 데이터를 처리할 때 가장 자주 쓰이는 기능 중 하나가 바로 검색입니다. 방대한 문자열 속에서 특정 기호를 찾거나, 특정 단어가 포함되어 있는지 확인해야 할 때 <string.h>의 strchr과 strstr 함수는 필수적인 도구입니다.

오늘은 이 두 함수의 동작 방식과 실무 활용 팁을 예제와 함께 정리해 보겠습니다.

Generated by Gemini AI.


1. strchr 함수: 특정 문자(Character) 찾기

strchr 함수는 문자열의 시작부터 탐색하여 특정 문자가 처음으로 나타나는 위치를 찾아줍니다.

1.1 함수 원형 및 특징

  • 원형: char *strchr(const char *str, int c);
  • 반환값: 찾은 문자의 메모리 주소(포인터)를 반환하며, 문자가 없으면 NULL을 반환합니다.
  • 특징: 검색할 문자 c는 int형으로 전달되지만 내부적으로는 char로 처리됩니다.

1.2 예제 코드

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

int main() {
    const char *str = "Embedded System";
    char ch = 'S';

    // 문자 'S'의 포인터 위치를 찾음
    char *pos = strchr(str, ch);

    if (pos) {
        // 포인터 뺄셈을 통해 몇 번째 인덱스인지 계산
        printf("문자 '%c'의 위치: %ld 인덱스\n", ch, pos - str);
    } else {
        printf("문자를 찾을 수 없습니다.\n");
    }

    return 0;
}

2. strstr 함수: 특정 문자열(Substring) 찾기

strstr 함수는 문자열 내에서 특정 단어나 부분 문자열이 시작되는 위치를 찾을 때 사용합니다.

2.1 함수 원형 및 특징

  • 원형: char *strstr(const char *haystack, const char *needle);
  • 반환값: 찾는 문자열이 시작되는 첫 번째 위치의 포인터를 반환하며, 없으면 NULL을 반환합니다.
  • 용도: 특정 명령어 파싱, 로그 메시지 필터링 등에 유용합니다.

2.2 예제 코드

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

int main() {
    const char *haystack = "I love C programming";
    const char *needle = "love";

    char *pos = strstr(haystack, needle);

    if (pos) {
        printf("\"%s\" 발견! 시작 위치: %ld\n", needle, pos - haystack);
    } else {
        printf("문자열을 찾을 수 없습니다.\n");
    }

    return 0;
}

3. strchr vs strstr 한눈에 비교

함수 검색 대상 주요 반환값 주요 용도
strchr 단일 문자 (char) 해당 문자의 포인터 구분자(콤마, 세미콜론 등) 찾기
strstr 문자열 (char *) 해당 문자열의 시작 포인터 키워드 검색, 특정 패턴 탐색

4. [실무 팁] 알아두면 유용한 검색 테크닉

① 뒤에서부터 찾고 싶을 때는? strrchr

파일 경로에서 파일명만 추출할 때처럼 뒤에서부터 문자를 찾아야 한다면 strrchr 함수를 사용하세요.

C
 
char *path = "/home/user/test.c";
char *filename = strrchr(path, '/') + 1; // 마지막 '/' 다음 위치

② 대소문자 구분 문제

두 함수 모두 대소문자를 엄격히 구분합니다. 만약 구분 없이 찾고 싶다면 검색 전에 모든 문자를 tolower() 함수로 소문자화하거나, 플랫폼 전용 함수(예: strcasestr)를 확인해 봐야 합니다.

③ 안전한 입력 처리 (fgets 활용)

사용자로부터 검색어를 입력받을 때는 scanf보다 fgets가 안전합니다. 단, fgets는 개행 문자(\n)까지 저장하므로 아래와 같이 제거해 주는 작업이 필요합니다.

C
 
keyword[strcspn(keyword, "\n")] = 0; // 개행 문자를 널 문자로 교체

5. 마무리하며

strchr과 strstr은 단순한 검색을 넘어 데이터 파싱의 기초가 되는 함수들입니다. 반환값이 인덱스 숫자가 아닌 '포인터'라는 점을 정확히 이해하면 훨씬 유연하게 메모리를 다룰 수 있습니다.

이번 포스팅이 C언어 문자열 탐색을 이해하는 데 도움이 되었기를 바랍니다.


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형