codingCat banner
codingCat banner
2018.08.20 11:38

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 IV. strchr, strrchr


본 포스팅에서는 문자열로부터 특정 문자character의 검색을 지원하는 함수인 strchr 계열의 함수에 대해 사용 예를 정리한다.

<Prologue>


strchrstrrchr는 문자열 중에서 특정 문자를 검색하여 그 위치를 얻는데 사용된다. 좀 더 엄밀히 말하면 그 문자가 시작되는 위치의 포인터를 반환한다. strchr은 문자열을 순방향으로 검색하여 가장 처음으로 발견될 때의 위치를 반환하고, strrchr은 문자열을 역방향으로 검색하여 가장 처음으로 발견될 때의 위치를 반환한다.

예를 들면 "What can I do for that?"라는 문자열에서 소문자 'a'로 시작되는 문자열을 얻고자 할 때,

strchr은 문자열을 첫 글자부터 순서대로 검색하여 ▶"What can I do for that?"와 같이 3번째에 있는 'a'를 검색하여 이 문자로 시작하는 문자열을 반환하고 strrchr은 문자열을 끝 글자부터 거꾸로 검색하여 "What can I do for that?"◀와 같이 맨 나중에 있는 'a'를 검색하여 이 문자로 시작하는 문자열을 반환한다.

1. strchr


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

const char * strchr(const char * str, int character);
char * strchr(char * str, int character);

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

char * strchr(const char * str, int character);
str
검색 대상이 되는 문자열이다.
character
검색하고자 하는 특정 문자이다.

함수의 실행 결과 character의 문자로 시작하는 부분 문자열을 반환한다. 찾을 수 없으면 NULL을 반환한다.

원형을 자세히 보면 문자 매개변수 characterchar 형이 아닌 int 형으로 선언되어 있다. 참고로 char 형은 1 바이트, int 형은 CPU가 처리할 수 있는 기본 단위로 정의된다. 예를 들어 16 비트 CPU에서는 int가 2 바이트이고, 32 비트 CPU에서는 int가 4 바이트이며, 64 비트 CPU에서는 int가 8 바이트이다. C 언어에서 int보다 작은 크기의 데이터가 전달된다고 하더라도 CPU는 내부의 전자 회로 설계상 int 형으로 처리한다.

다음은 strchr의 사용 예이다.

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

int main(int argc, char * argv[])
{
	char str[64] = "What can I do for that?";             // original string
	char * result = NULL;                                // result of strchr

	result = strchr(str, 'a');                     // find the character 'a'
	if (result != NULL)
	{
		printf("strchr(\"%s\", 'a') = \"%s\";\n", str, result);
		printf("strchr(\"%s\", 'a') : %ld(th) character.\n", str, (result - str) + 1);
	}

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

위 코드와 실행 결과를 참고하면, strchr(str, 'a');을 실행함으로써 대상 문자열의 3번째 위치한 'a'를 검색하였고 이 문자부터 시작하는 부분 문자열 "at can I do for that?"을 반환하였다. 반환된 문자열은 원본 문자열의 일부이므로 포인터간 뺄셈 연산을 사용하여 몇 번째 문자로서 검색되었는지를 확인할 수 있다. ((result - str) + 1)

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


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

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

const wchar_t * wcschr(const wchar_t * str, wchar_t character);
wchar_t * wcschr(wchar_t * str, wchar_t character);

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

wchar_t * wcschr(const wchar_t * ws, wchar_t wc);

2. strrchr


strrchr 함수도 위의 strchr 함수와 동일하다. 다만, 검색 방향이 문자열의 맨 끝 문자부터 검색한다는 차이만이 있다. 함수의 원형은 다음과 같다.

C++ 헤더인 cwchar에는 상수성 여부에 따라,

const char * strrchr(const char * str, int character);
char * strrchr(char * str, int character);

C 헤더인 wchar.h에는,

char * strrchr(const char * str, int character);
str
검색 대상이 되는 문자열이다.
character
검색하고자 하는 특정 문자이다.

다음은 strrchr의 사용 예이다.

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

int main(int argc, char * argv[])
{
	char str[64] = "What can I do for that?";             // original string
	char * result = NULL;

	result = strrchr(str, 'a');                    // find the character 'a'
	if (result != NULL)
	{
		printf("strrchr(\"%s\", 'a') = \"%s\";\n", str, result);
		printf("strrchr(\"%s\", 'a') : %ld(th) character.\n", str, (result - str) + 1);
	}

	return 0;
}
[그림 3] strrchr.c 예제 소스 코드
[그림 4] strrchr.c 예제 소스 코드의 실행 결과

[그림 2]와 [그림 4]의 실행결과를 비교해보면, result = strchr(str, 'a');을 실행 시 순방향으로 검색이 이루어지므로 최초 발견되는 문자는 3번째 문자인 'a'가 되어 "at can I do for that?" 문자열이 반환되지만 result = strrchr(str, 'a');을 실행 시 역방향으로 검색이 이루어지므로 최초 발견되는 문자는 21번째 문자인 'a'가 되어 "at?" 문자열이 반환됨을 알 수 있다.

2-1. Wide Character 확장 함수 - wcsrchr


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

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

const wchar_t * wcsrchr(const wchar_t * str, wchar_t character);
wchar_t * wcsrchr(wchar_t * str, wchar_t character);

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

wchar_t * wcsrchr(const wchar_t * ws, wchar_t wc);

<Epilogue>


본 포스팅을 통해 문자열의 문자 검색 함수에 대해 정리해 보았다. 다음 포스팅[libc 문자열 조작 함수 정리 (part 05 - strstr)]에서는 문자열 내에 특정 문자열을 찾아주는 strstr 함수에 대해 정리한다.


trackbacks: 0, comments: 0
 
Comments
 
 
'Language/C & C++' Related Articles