libc 문자열 조작 함수 정리
C 언어에서 문자열 처리는 복잡하다. 언어 수준에서 문자열이라는 데이터 형 자체를 지원하지도 않으니, 덧셈 기호(+)나 비교연산자(==)와 같은 기호를 사용하는 직관적인 문자열 연산을 사용할 수 없기 때문이다. C 언어가 문자열 데이터 형을 지원하지 않고, 문자열을 다루는 연산자도 없으니 모든 문자열 연산은 문자열 함수를 통해 이루어진다. C 표준 라이브러리(일명 'libc')에서 str...
로 시작하는 함수들이 그것이며, 모두 string.h
헤더(C++은 cstring
헤더)에 정의되어 있으며 본 시리즈를 통해 이들 함수의 사용법을 정리해보고자 한다. 본 시리즈는 cplusplus(http://www.cplusplus.com) 및 MSDN에 나와있는 레퍼런스를 기준으로 하여 작성되었다.
- libc 문자열 조작 함수 정리 (part 01 - strcpy, strncpy)
- libc 문자열 조작 함수 정리 (part 02 - strcat, strncat)
- libc 문자열 조작 함수 정리 (part 03 - strcmp, strncmp)
- libc 문자열 조작 함수 정리 (part 04 - strchr, strrchr)
- libc 문자열 조작 함수 정리 (part 05 - strstr)
- libc 문자열 조작 함수 정리 (part 06 - strtok)
- libc 문자열 조작 함수 정리 (part 07 - strspn, strcspn)
- libc 문자열 조작 함수 정리 (part 08 - strlen)
- libc 문자열 조작 함수 정리 (part 09 - strpbrk)
- libc 문자열 조작 함수 정리 (part 10 - strxfrm, strcoll)
- libc 문자열 조작 함수 정리 (part 11 - strerror)
Part IV. strchr, strrchr
본 포스팅에서는 문자열로부터 특정 문자character의 검색을 지원하는 함수인 strchr
계열의 함수에 대해 사용 예를 정리한다.
<Prologue>
strchr
와 strrchr
는 문자열 중에서 특정 문자를 검색하여 그 위치를 얻는데 사용된다. 좀 더 엄밀히 말하면 그 문자가 시작되는 위치의 포인터를 반환한다. 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
을 반환한다.
원형을 자세히 보면 문자 매개변수 character
가 char
형이 아닌 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;
}
위 코드와 실행 결과를 참고하면, 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;
}
[그림 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
함수에 대해 정리한다.