Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 strstr() 함수 완벽 가이드: 문자열 속 부분 문자열 찾기

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);처럼 작성하면 버퍼 크기를 초과하는 입력을 방지할 수 있습니다.