C언어에서 텍스트 데이터를 처리할 때 가장 자주 쓰이는 기능 중 하나가 바로 검색입니다. 방대한 문자열 속에서 특정 기호를 찾거나, 특정 단어가 포함되어 있는지 확인해야 할 때 <string.h>의 strchr과 strstr 함수는 필수적인 도구입니다.
오늘은 이 두 함수의 동작 방식과 실무 활용 팁을 예제와 함께 정리해 보겠습니다.

1. strchr 함수: 특정 문자(Character) 찾기
strchr 함수는 문자열의 시작부터 탐색하여 특정 문자가 처음으로 나타나는 위치를 찾아줍니다.
1.1 함수 원형 및 특징
- 원형: char *strchr(const char *str, int c);
- 반환값: 찾은 문자의 메모리 주소(포인터)를 반환하며, 문자가 없으면 NULL을 반환합니다.
- 특징: 검색할 문자 c는 int형으로 전달되지만 내부적으로는 char로 처리됩니다.
1.2 예제 코드
#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 예제 코드
#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 함수를 사용하세요.
char *path = "/home/user/test.c";
char *filename = strrchr(path, '/') + 1; // 마지막 '/' 다음 위치
② 대소문자 구분 문제
두 함수 모두 대소문자를 엄격히 구분합니다. 만약 구분 없이 찾고 싶다면 검색 전에 모든 문자를 tolower() 함수로 소문자화하거나, 플랫폼 전용 함수(예: strcasestr)를 확인해 봐야 합니다.
③ 안전한 입력 처리 (fgets 활용)
사용자로부터 검색어를 입력받을 때는 scanf보다 fgets가 안전합니다. 단, fgets는 개행 문자(\n)까지 저장하므로 아래와 같이 제거해 주는 작업이 필요합니다.
keyword[strcspn(keyword, "\n")] = 0; // 개행 문자를 널 문자로 교체
5. 마무리하며
strchr과 strstr은 단순한 검색을 넘어 데이터 파싱의 기초가 되는 함수들입니다. 반환값이 인덱스 숫자가 아닌 '포인터'라는 점을 정확히 이해하면 훨씬 유연하게 메모리를 다룰 수 있습니다.
이번 포스팅이 C언어 문자열 탐색을 이해하는 데 도움이 되었기를 바랍니다.
포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!
임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
'Core Programming > C Standard Library: Resource & Performan' 카테고리의 다른 글
| C언어 문자열 검색 완벽 가이드: strspn과 strcspn 차이 및 실전 활용법 (0) | 2025.02.14 |
|---|---|
| C언어 문자열 자르기와 복제: strtok, strdup 완벽 가이드 (메모리 관리 팁) (0) | 2025.02.13 |
| C언어 문자열 비교 완벽 가이드: strcmp와 strncmp 사용법 및 원리 (0) | 2025.02.11 |
| C언어 문자열 이어붙이기 완벽 가이드: strcat과 strncat의 안전한 사용법 (0) | 2025.02.10 |
| C언어 문자열 함수 총정리: strlen, strcpy, strncpy 안전한 사용법 (0) | 2025.02.09 |