strxfrm() 함수의 헤더 파일
#include <string.h>
strxfrm() 함수의 원형
size_t strxfrm( char * des, const char * src, size_t num);
Parameter
des
데이터를 복사할 주소이고 char * 형으로 변환되어서 전달된다.
주소를 전달해주면 된다.
src
복사할 데이터가 존재하는 위치의 주소이고 char * 형으로 변환되어서 전달된다.
주소를 전달해주면 된다.
num
복사할 데이터의 byte 수이며 size_t 형으로 전달해주면 된다.
리턴 값
변화된 문자열의 길이를 리턴한다.
단, 해당 문자열의 NULL은 계산되지 않는다.
strxfrm() 함수는 일반적인 복사함수가 아닌 LC_COLLATE 정의된 방식으로 변환 후 복사하는 기능이 있어요.
또한 변화된 문자열의 길이를 측정하는 함수로 사용할 수도 있어요.
그럼 LC_COLLATE가 무엇이냐? 아래 포스팅에 자세히 적혀 있습니다.
[C언어] String.h 라이브러리 함수 - strcoll() 함수 파헤치기(문자열 비교, 같은 문자열 찾기)
strcoll() 함수의 헤더 파일 #include strcoll() 함수의 원형 int strcoll(const char * str1, const char * str2); Parameter str1 비교할 첫 번째 메모리 블록의 주소를 인자로 받으며 const char * 형으로 되어..
idsn.tistory.com
Θ strxfrm() 함수는 어떻게 동작하는 걸까요?
strxfrm() 함수는 다른 복사함수들과 복사하는 방법은 비슷해요.
다만 복사하기 전에 LC_COLLATE 에 맞게 문자열을 변형해주는 단계가 추가 되었다고 보시면 되요.
Θ strxfrm() 함수는 언제 사용할까요?
보통 strcoll() 함수로 비교하기 전에 LC_COLLATE 에 맞게 문자열을 변형하기 위해 사용해요.
예를 들어 č 와 h 를 단순 유니코드상으로 비교해보면
č => U+0109 이고
h => U+0068 로 표현되요
그럼 문자 h > 문자 č 이 되어 strcoll(h, č) 함수로 문자열을 비교하면 양수가 나오겠죠??
하지만 LC_COLLATE를 cs_CZ.UTF-8(체코어) 로 변경하면 이야기가 달라져요
cs_CZ.UTF-8 문자 사전에서는 문자 č > 문자 h 이여서 strcoll(h, č) 함수로 문자열을 비교하면 음수가 나와요.
아래 그림처럼 많이 사용해요.
자 이제 실제 코드를 확인해보죠!
#include <string.h>
#include <locale.h>
int main(){
char str1[20] = "hlava";
char str2[20] = {0};
char str3[2] = {0x68, 0x00};
char xfrm3[20] = {0};
char str4[2] = {0xC4, 0x00};
char xfrm4[20] = {0};
int size = 0, com = 0;
char * result = NULL;
size = strxfrm(str2, str1, sizeof(str1));
printf("*************************\n");
printf("set locale = null\n");
printf("str1: [%s]\n", str1);
printf("str2: [%s]\n", str2);
printf("size: [%d]\n", size);
printf("*************************\n");
result = setlocale(LC_ALL, "en_US.UTF-8");
size = strxfrm(str2, str1, sizeof(str1));
printf("*************************\n");
printf("set locale = %s\n", result);
printf("str1: [%s]\n", str1);
printf("str2: [%s]\n", str2);
printf("size: [%d]\n", size);
printf("*************************\n");
result = setlocale(LC_ALL, "en_US.UTF-8");
size = strxfrm(xfrm3, str3, sizeof(str3));
size = strxfrm(xfrm4, str4, sizeof(str4));
com = strcoll(xfrm3, xfrm4);
printf("set locale = %s\n", result);
printf("compare str3, str4: [%s, %s]\n", str3, str4);
printf("com : [%d]\n", com);
result = setlocale(LC_ALL, "cs_CZ.UTF-8");
size = strxfrm(xfrm3, str3, sizeof(str3));
size = strxfrm(xfrm4, str4, sizeof(str4));
com = strcoll(xfrm3, xfrm4);
printf("set locale = %s\n", result);
printf("compare str3, str4: [%s, %s]\n", str3, str4);
printf("com : [%d]\n", com);
return 0;
}
실행 결과
다른 string.h 파일의 함수에 대해 알고 싶으시다면 String.h 함수 파헤치기!!
[C언어] String.h 헤더 파일 분석하기(String.h 함수 모음, C언어 래퍼런스)
c언어를 사용하시거나 해보셨던 분들은 대부분 memcpy, memset 함수를 사용해보셨을 텐데요. 해당 함수를 사용하기 위해서는 String.h 파일을 포함시켜줬던 기억이 나실겁니다. 요렇게요 #include #include
idsn.tistory.com
'C 언어 > C 언어 리이브러리 함수' 카테고리의 다른 글
[C언어] String.h 라이브러리 함수 - memchr() 함수 파헤치기 (0) | 2021.04.20 |
---|---|
[C언어] String.h 라이브러리 함수 - strcnmp() 함수 파헤치기(문자열 비교, 같은 문자열 찾기) (0) | 2021.03.25 |
[C언어] String.h 라이브러리 함수 - strcoll() 함수 파헤치기(문자열 비교, 같은 문자열 찾기) (0) | 2021.03.17 |
[C언어] String.h 라이브러리 함수 - strcmp() 함수 파헤치기(문자열을 비교, 같은 문자열 찾기) (0) | 2021.02.14 |
[C언어] String.h 라이브러리 함수 - memcmp() 함수 파헤치기(문자열을 비교해보자, 같은 문자열 찾기) (0) | 2021.02.09 |