본문으로 바로가기
728x90
반응형
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

반응형