^(코딩캣)^ = @"코딩"하는 고양이;

libc 문자열 조작 함수 정리 (part 05 - strstr)

Language/C & C++
2018. 8. 20. 18:06

libc 문자열 조작 함수 정리


C 언어에서 문자열 처리는 복잡하다. 언어 수준에서 문자열이라는 데이터 형 자체를 지원하지도 않으니, 덧셈 기호(+)나 비교연산자(==)와 같은 기호를 사용하는 직관적인 문자열 연산을 사용할 수 없기 때문이다. C 언어가 문자열 데이터 형을 지원하지 않고, 문자열을 다루는 연산자도 없으니 모든 문자열 연산은 문자열 함수를 통해 이루어진다. C 표준 라이브러리(일명 'libc')에서 str...로 시작하는 함수들이 그것이며, 모두 string.h 헤더(C++은 cstring 헤더)에 정의되어 있으며 본 시리즈를 통해 이들 함수의 사용법을 정리해보고자 한다. 본 시리즈는 cplusplus(http://www.cplusplus.com) 및 MSDN에 나와있는 레퍼런스를 기준으로 하여 작성되었다.

  1. libc 문자열 조작 함수 정리 (part 01 - strcpy, strncpy)
  2. libc 문자열 조작 함수 정리 (part 02 - strcat, strncat)
  3. libc 문자열 조작 함수 정리 (part 03 - strcmp, strncmp)
  4. libc 문자열 조작 함수 정리 (part 04 - strchr, strrchr)
  5. libc 문자열 조작 함수 정리 (part 05 - strstr)
  6. libc 문자열 조작 함수 정리 (part 06 - strtok)
  7. libc 문자열 조작 함수 정리 (part 07 - strspn, strcspn)
  8. libc 문자열 조작 함수 정리 (part 08 - strlen)
  9. libc 문자열 조작 함수 정리 (part 09 - strpbrk)
  10. libc 문자열 조작 함수 정리 (part 10 - strxfrm, strcoll)
  11. libc 문자열 조작 함수 정리 (part 11 - strerror)

Part V. strstr


본 포스팅에서는 부분 문자열substring 포함 여부 확인을 지원하는 함수인 strstr 계열의 함수에 대해 사용 예를 정리한다.

<Prologue>


strstr은 문자열에 대하여 지정한 부분 문자열을 포함하는 지 여부를 확인하는 함수이다. 가장 직접적인 예시로는 문장 내 비속어를 찾아 필터링을 하는 경우가 있다.

1. strstr


C++ 라이브러리에서 제공하는 헤더 파일인 cstring에서는 검색 대상 문자열의 상수성 여부에 따라 2개의 함수가 오버로드overload되어 있다.

const char * strstr(const char * str1, const char * str2);
char * strstr(char * str1, const char * str2);

C 라이브러리에서 제공하는 헤더 파일인 string.h에서는 하나의 함수만이 정의되어 있다.

char * strstr(const char * str1, const char * str2);
str1
검색 대상이 될 문자열이다.
str2
찾을 문구이다.

함수의 실행 결과 str2에서 지정한 문자열이 발견된 위치를 포인터로 반환한다. 그런 문구가 없으면 NULL이 반환된다.

다음은 strstr 함수의 실행 예이다.

/* strstr.c */
#include <stdio.h>
#include <string.h>

int main(int argc, char * argv[])
{
	char str1[64] = "What the hell! Why don't you clean this room?";
	char str2[64] = "What the f*ck! Why don't you clean this room?";
	char str3[64] = "f*ck";
	char * result = NULL;

	result = strstr(str1, str3);
	if (result != NULL)
	{
		// contains forbidden word
		printf("strstr(\"%s\", \"%s\")\n = \"%s\";\n", str1, str3, result);
		printf("forbidden word: %s\n", result);
	}
	else
	{
		// not contains forbidden word
		printf("strstr(\"%s\", \"%s\")\n = NULL;\n", str1, str3);
		printf("forbidden word: none\n");
	}

	printf("\n");

	result = strstr(str2, str3);
	if (result != NULL)
	{
		// contains forbidden word
		printf("strstr(\"%s\", \"%s\")\n = \"%s\";\n", str2, str3, result);
		printf("forbidden word: %s\n", result);
	}
	else
	{
		// not contains forbidden word
		printf("strstr(\"%s\", \"%s\")\n = NULL;\n", str2, str3);
		printf("forbidden word: none\n");
	}

	return 0;
}
[그림 1] strstr.c 예제 소스 코드
[그림 2] strstr.c 예제 소스 코드의 실행 결과

위 코드를 참조하면, 검색 대상이 될 두 개의 문자열이 준비되어 있다. 하나는 "What the hell! Why don't you clean this room?"로서 욕설이 없는 문자열을 포함하는 str1이고, 다른 하나는 "What the f*ck! Why don't you clean this room?"로서 욕설이 있는 문자열을 포함하는 str2이다. 그리고 "f*ck"로서 검색할 욕 단어를 포함하는 str3가 준비되어 있다.

result = strstr(str1, str3);로서 str1에 대해 욕 단어가 있는지를 검색한다. 이 문자열에는 욕 단어가 포함되어 있지는 않으므로 NULL가 반환되며 result 포인터 변수에도 NULL이 보관된다.

result = strstr(str2, str3);로서 str2에 대해 욕 단어가 있는지를 검색한다. 이 문자열에는 str3에서 지정한 욕 단어가 포함되어 있으므로 해당 욕 단어가 시작되는 포인터가 반환되고 result 변수에 이 주소가 보관된다. 그러므로 printf로 이 변수를 출력하면 해당 욕으로 시작되는 부분 문자열이 출력되는 것이다.

1-1. Wide Character 확장 함수 - wcsstr


상기 strstr은 ASCII 문자열 또는 UTF-8 인코딩의 Unicode 문자열에 대해 사용 가능하다. UTF-16/UTF-32와 같은 Wide Character 문자열의 복사는 아래의 함수를 사용 가능하며, wchar.h, C++에서는 cwchar 헤더를 include한다.

C++ 헤더인 cwchar에는 상수성 여부에 따라 다음의 두 함수가 오버로드되어 있다.

const wchar_t * wcsstr(const wchar_t * str1, const wchar_t * str2);
wchar_t * wcsstr(wchar_t * str1, const wchar_t * str2);

C 헤더인 wchar.h에는 하나의 함수만이 정의되어 있다.

wchar_t * wcsstr(const wchar_t * str1, const wchar_t * str2);

<Epilogue>


본 포스팅을 통해 문자열의 문자열 검색 함수에 대해 정리해 보았다. 다음 포스팅[libc 문자열 조작 함수 정리 (part 06 - strtok)]에서는 특정 기호로 구분된 문자열을 분할해주는 strtok 함수에 대해 정리한다.

카테고리 “Language/C & C++”
more...