C 표준 라이브러리 함수 char *strstr(const char *haystack, const char *needle)는 haystack(검색 대상 문자열) 안에서 needle(찾고자 하는 부분 문자열)이 처음 나타나는 위치를 찾는 함수입니다. 이때 문자열의 끝을 알리는 널 문자('\0')는 비교 대상에서 제외됩니다.
프로그래밍에서 문자들이 순서대로 모인 배열을 '문자열(string)'이라고 부릅니다.
문자열 선언
문자열(문자 배열)을 선언하는 기본 문법은 다음과 같습니다.
char stringname [size];
예를 들어 char string[50];처럼 선언하면 최대 50글자를 저장할 수 있는 문자열이 만들어집니다.
문자열 초기화
문자열을 초기화하는 방법에는 크게 두 가지가 있습니다.
- 단일 문자 상수를 하나씩 나열하는 방법
char string[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };- 문자열 상수를 통째로 대입하는 방법
char string[10] = "Hello";
접근(Accessing) − 입출력 시 서식 지정자 "%s"를 사용하면 널 문자('\0')를 만날 때까지 문자열 전체를 읽거나 출력할 수 있습니다.
strstr() 함수란?
메인 문자열 안에 특정 부분 문자열이 존재하는지 검사할 때 사용합니다.
부분 문자열(s2)이 발견되면 메인 문자열(s1)에서 처음 등장한 위치의 포인터를 반환하고, 찾지 못하면 NULL을 반환합니다.
문법
strstr() 함수의 기본 문법은 다음과 같습니다.
strstr(mainstring, substring);
예제 1: strstr() 기본 사용법
다음 프로그램은 strstr() 함수를 이용해 입력받은 문자열에서 원하는 단어를 검색하고 그 위치를 출력합니다.
#include<stdio.h>
void main(){
char a[30],b[30];
char *found;
printf("Enter a string:\n");
gets(a);
printf("Enter the string to be searched for:\n");
gets(b);
found=strstr(a,b);
if(found)
printf("%s is found in %s in %d position",a,b,found-a);
else
printf("-1 since the string is not found");
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter a string: how are you Enter the string to be searched for: you you is found in 8 position
포인터 연산 found-a를 통해 부분 문자열이 시작되는 인덱스 위치(0부터 시작)를 계산할 수 있습니다.
예제 2: 부분 문자열 존재 여부 확인
이번에는 strstr() 라이브러리 함수를 활용해 한 문자열이 다른 문자열에 포함되어 있는지 확인하는 프로그램을 살펴보겠습니다.
#include<stdio.h>
#include<string.h>
void main(){
//두 개의 문자열 선언//
char mainstring[50],substring[50];
char *exists;
//문자열 입력 받기//
printf("Enter the main string : \n ");
gets(mainstring);
printf("Enter the sub string you would want to check if exists in main string :");
gets(substring);
//라이브러리 함수로 부분 문자열 검색//
exists = strstr(mainstring,substring);
//조건 판별//
if(exists){
printf("%s exists in %s ",substring,mainstring);
} else {
printf("'%s' is not present in '%s'",substring,mainstring);
}
}실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Enter the main string : TutorialsPoint c Programming Enter the sub string you would want to check if exists in main string :Programming Programming exists in TutorialsPoint c Programming
참고: gets() 함수의 보안 문제
예제 코드에서 사용된 gets() 함수는 입력 길이를 제한하지 못해 버퍼 오버플로우 위험이 있으며, C11 표준부터 공식적으로 제거되었습니다. 실무에서는 fgets()를 사용하는 것이 안전합니다. 예를 들어 fgets(mainstring, sizeof(mainstring), stdin);처럼 작성하면 버퍼 크기를 초과하는 입력을 방지할 수 있습니다.