CreateMutex
까보면 다나와~
툴 정보 및 사용법/C/C++ (1)

C/C++ unicode 문자열 처리 함수

http://blog.naver.com/nawoo/80102722318


C언어는 정말 타입 정의가 너무 헷갈린다는;;ㅜ

--------------------------------------------------------


멀티 바이트 환경에서 사용하던 함수를 유니코드 환경에서 사용하려고 하면 사용이 안된다.

 

처음에 VS2008을 사용하면서 예전 책을 보면서 공부할 때 가장 많이 머리가 아프던 문제였다.

 

유니코드 환경에서 사용 할 수 있게 정의가 되어진 함수들은 같은 함수명을 써도 자동으로 처리가 되기 때문에

 

특별히 신경을 쓸 일은 없었다. 그러나 문자열처리 함수 같은경우는 아예 함수 이름이 바뀌었기 때문에 모른다면 사용 할 수가 없다.

 

그래서 문자열 처리 함수를 정리 할 겸 유니코드 환경에서 사용 할 수 있는 문자열 처리 함수를 정리해 보았다.

 

 

일단 기본적으로 멀티 바이트 환경에서 문자열 처리 함수의 접두어는 str 이었다 strlen, strcat, strstr 등등

 

그러나 유니코드 환경에서 접두어는 wcs이다. 이것만 기억해 둔다면 이미 문자열처리 함수의 절반은 안것이다.

 

 

1-1.strcpy -> wcscpy

 

:문자열을 복사하는 함수이다

 

원형 :

wchar_t *wcscpy(
   wchar_t *strDestination,           복사 당하는 대상
   const wchar_t *strSource           복사 하려는 소스
); 

ex)

TCHAR str[256];

wcscpy(str,L"안녕하세요");

TextOut(hdc,0,0,str,wcslen(str));

 

:결과 = 0,0에 "안녕하세요" 문자열 출력

 

 

1-2. strncpy -> wcsncpy

 

:입력한 사이즈 만큼 문자열을 복사하는 함수이다

 

원형 :

wchar_t *wcsncpy(
   wchar_t *strDest,                복사 당하는 대상
   const wchar_t *strSource,        박사 하려는 소스
   size_t count                     복사하려는 개수
); 

ex)

TCHAR str[256];

memset(str,0,sizeof(str));                  NULL값으로 배열을 초기화

wcsncpy(str,L"안녕하세요", 2);

TextOut(hdc,0,0,str,wcslen(str));

 

:결과 = 0,0에 "안녕" 문자열 출력

 

 

2. strlen -> wcslen

 

: 입력 받은 문자열의 길이를 반환해준다.

sizeof와 다른점은 sizeof는 배열의 전체크기를 반환해주고

wcslen은 중간에 NULL을 만나면 NULL까지의 길이만 반환한다.

 

원형 :

size_t wcslen(
   const wchar_t *str 
);

 

 

3-1.strcat -> wcscat

 

: 두 문자열을 이어준다

 

원형 :

wchar_t *wcscat(
   wchar_t *strDestination,
   const wchar_t *strSource 
); 

ex)

wcscpy(str,L"안녕하세요");
wcscat(str,L"오냐");

TextOut(hdc,0,0,str,wcslen(str));

 

:결과 = 0,0에 "안녕하세요오냐" 출력

 

 

3-2.strncat -> wcsncat

 

: 입력한 사이즈만큼 대상에 소스를 이어준다

 

원형 :

wchar_t *wcsncat(
   wchar_t *strDest,
   const wchar_t *strSource,
   size_t count 
); 

ex)

wcscpy(str,L"안녕하세요");
wcsncat(str,L"오냐",1);

TextOut(hdc,0,0,str,wcslen(str));

 

:결과 = 0,0에 "안녕하세요오" 출력

 

 

4-1.strcmp -> wcscmp

 

: 문자열을 비교한다.

 

원형 :

int wcscmp(
   const wchar_t *string1,
   const wchar_t *string2 
); 

string1과 string2가 같으면 0

string1>string2 이면 양수

string1<string2 이면 음수

 

ex)

wcscpy(str,L"안녕하세요");

wcscpy(str2,L"하이");

if(wcscmp(str,str2) == 0){

  TextOut(hdc,0,0,L"같다",2);

}else{

  TextOut(hdc,0,0,L"다르다",3);

}

:출력 = 0,0에 "다르다" 출력

 

 

4-2.strncmp -> wcsncmp

 

:지정한 사이즈만큼 대소문자를 구분하지 않고 문자열을 비교한다.

 

원형 :

int wcsncmp(
   const wchar_t *string1,
   const wchar_t *string2,
   size_t count 
);
 

string1과 string2가 같으면 0

string1>string2 이면 양수

string1<string2 이면 음수

 

ex)

wcscpy(str,L"안녕하세요");

wcscpy(str2,L"안하이");

if(wcsncmp(str,str2,1) == 0){

  TextOut(hdc,0,0,L"같다",2);

}else{

  TextOut(hdc,0,0,L"다르다",3);

}

:출력 = 0,0에 "같다" 출력

 

 

5-1. stricmp -> wcsicmp

 

:대소문자를 구별하지 않고 문자열을 비교

 

원형 :

int _wcsicmp(
   const wchar_t *string1,
   const wchar_t *string2 
); 

string1과 string2가 같으면 0

string1>string2 이면 양수

string1<string2 이면 음수

 

ex)

wcscpy(str,L"ABCDE");

wcscpy(str2,L"abcde");

if(wcsicmp(str,str2) == 0){

  TextOut(hdc,0,0,L"같다",2);

}else{

  TextOut(hdc,0,0,L"다르다",3);

}

:출력 = 0,0에 "같다" 출력

 

 

5-2. strnicmp -> wcsnicmp

 

:대소문자를 구별하지 않고 문자열을 비교

 

원형 :

int _wcsnicmp(
   const wchar_t *string1,
   const wchar_t *string2,
   size_t count 
);
 

string1과 string2가 같으면 0

string1>string2 이면 양수

string1<string2 이면 음수

 

ex)

wcscpy(str,L"ABCDE");

wcscpy(str2,L"abcdefgh");

if(wcsnicmp(str,str2,5) == 0){

  TextOut(hdc,0,0,L"같다",2);

}else{

  TextOut(hdc,0,0,L"다르다",3);

}

:출력 = 0,0에 "같다" 출력

 

 

6-1.strchr -> wcschr

 

:문자열에서 한 문자를 찾아 그 문자가 있는 주소를 반환하여 준다. (문자열의 처음부터 검사한다)

:만약에 찾지 못했을 경우에는 NULL값을 반환해준다

 

원형:

wchar_t *wcschr(
   wchar_t *str,
   wchar_t c 
); 

ex)

wcscpy(str2,L"에요안녕하세요하이");
   
TCHAR dd = L'요';
TCHAR * ddd;
   
ddd = wcschr(str2,dd);

 

TextOut(hdc,0,0,ddd,wcslen(ddd));

 

:출력 = 0,0에 "요안녕하세요하이" 출력

 

 

6-2.strrchr -> wcsrchr

 

:문자열에서 한 문자를 찾아 그 문자가 있는 주소를 반환하여 준다. (문자열의 맨 마지막부터 검색한다)

:만약에 찾지 못했을 경우에는 NULL값을 반환해준다

 

원형:

wchar_t *wcsrchr(
   wchar_t *str,
   wchar_t c 
); // C++ only

ex)

wcscpy(str2,L"에요안녕하세요하이");
   
TCHAR dd = L'요';
TCHAR * ddd;
   
ddd = wcsrchr(str2,dd);

 

TextOut(hdc,0,0,ddd,wcslen(ddd));

 

:출력 = 0,0에 "요하이" 출력

 

 

7.strstr -> wcsstr

 

:문자열에서 원하는 문자열을 찾아준다.

 

원형 :

wchar_t *wcsstr(
   wchar_t *str,
   const wchar_t *strSearch 
);

 

ex)

wcscpy(str2,L"에요안녕하세요하이");
   
TCHAR * ddd;
ddd = wcsstr(str2,L"안녕");

TextOut(hdc,0,0,ddd,wcslen(ddd)); 

:출력 = "안녕하세요하이" 출력

 

 

8.strpbrk -> wcspbrk

 

: 첫번째 인수로 받은 문자열에서 두번째 인수로 받은 문자열중 한문자라도 빨리 나오는 문자의 주소를 반환해준다.

 

원형 :

wchar_t *wcspbrk(
   wchar_t *str,
   const wchar_t *strCharSet 
); // C++ only 

ex)

wcscpy(str2,L"에요안녕하세요하이");
   
TCHAR * ddd; 

ddd = wcspbrk(str2,L"녕세");            '녕' 이나 '세' 이 두글자 중에 빨리 나오는 문자의 주소를 출력해준다

TextOut(hdc,0,0,ddd,wcslen(ddd)); 

:출력 = "녕하세요하이" 출력

 

 

9.strtok -> wcstok

 

: 첫번째 매개변수로 받은 문자열을 두번째 매개변수로 받은 토큰 문자로 나누어준다.

 

원형 :

wchar_t *wcstok(
   wchar_t *strToken,
   const wchar_t *strDelimit 
); 

ex)

wcscpy(str2,L"나의'가치'는 내가 결정하고, 당신의 '가치'는 당신이 결정한다");
TCHAR * ddd;

ddd = wcstok(str2,L" ,'");      //토큰은 여러개를 지정할 수 있다. 여기서는 공백(' ')과 콤마(',') 작은따옴표(')로 지정했다.
while(ddd != NULL){
 TextOut(hdc,0,i,ddd,wcslen(ddd));
 ddd = wcstok(NULL,L" ,'");     //검색을 계속 해야하기 때문에 NULL값을 매개변수로 넣어준다

 i+=20;
}

 

wcstok의 방식은 문자열에서 처음 토큰을 발견하면 그 주소를 저장하고 두번째 토큰을 찾아내면 그 토큰을 NULL로 만들고

 

처음 토큰 주소를 반환해준다. 또한 wcstok함수는 함수 중간 결과를 자체적으로 정적변수를 사용하고 있다. 그렇기 때문에

 

계속 검색을 하고 싶으면 첫번째 매개변수로 NULL을 넣어주면 문자열이 끝날때 까지 검색을 한다.

 

검색이 끝나면 NULL을 반환해 준다.

 

wcstok함수도 매개변수로 받은 데이터를 손상시키기 때문에 데이터가 손상되지 않게 하려면 다른곳에 복사한 후에 써야한다.

 

또한 함수 자체적으로 정적 변수를 사용하고있기 때문에 멀티 스레드 환경에서 동시에 호출될 염려가 있으므로

 

동시에 호출되지 않도록 보호해 주어야 한다.

 

:출력 =

나의

가치

내가

결정하고

당신의

가치

당신이

결정한다

 

 

10-1.strset -> wcsset

 

: 첫번째 매개변수로 받은 문자열을 NULL문자 전까지 모두 두번째 문자로 바꾼다

 

원형 :

wchar_t *_wcsset(
   wchar_t *str,
   wchar_t c 
); 

ex)

wcscpy(str,L"ABCDE");

wcsset(str,L'd');
TextOut(hdc,0,0,str,wcslen(str));

 

:출력 =  0,0에 "ddddd" 문자열이 출력된다

 

 

10-2.strnset -> wcsnset

 

: 첫번째 매개변수로 받은 문자열을 입력받은 사이즈 만큼 두번째 문자로 바꾼다

 

원형 :

wchar_t *_wcsnset(
   wchar_t *str,
   wchar_t c,
   size_t count 
);

ex)

wcscpy(str,L"ABCDE");

wcsnset(str,L'd',2);
TextOut(hdc,0,0,str,wcslen(str));

 

:출력 =  0,0에 "ddCBD" 문자열이 출력된다

 

 

11.

strupr -> wcspur

strlwr -> wcslwr

 

: 지정한 문자열을 대문자로 치환(wcspur) 하거나 소문자로 치환(wcslwr)한다.

: 단 대문자나 소문자만 치환이 되고 한글이나 숫자는 치환되지 않는다.

: 이 함수도 매개변수로 받은 문자열을 변형시키기 때문에 변형되어서는 안되는 문자열이면 복사를 해놓고 사용해야 한다.

 

wcscpy(str,L"1abcdeABCDE아");

wcsupr(str);
TextOut(hdc,0,0,str,wcslen(str)); 

wcslwr(str);
TextOut(hdc,0,20,str,wcslen(str)); 

:출력 =

0,0에 "1ABCDEABCDE아" 출력

0,20에 "1abcdeabcde아" 출력

 

12.strrev -> wcsrev

 

: 지정한 문자열을 역순으로 배치한다. 한글도 역순으로 배치된다.

: 이 함수도 매개변수로 받은 문자열을 변형시키기 때문에 변형되어서는 안되는 문자열이면 복사를 해놓고 사용해야 한다.

 

원형 :

wchar_t *_wcsrev(
   wchar_t *str 
);

ex)

wcscpy(str,L"1abcdeABCDE아");

wcscpy(str2,L"나의 '가치'는 내가 결정하고, 당신의 '가치'는 당신이 결정한다");
   
wcsrev(str);
wcsrev(str2);

TextOut(hdc,0,0,str2,wcslen(str2));
TextOut(hdc,0,20,str,wcslen(str));

:출력 =

0,0에 "다한정결 이신당 는'치가' 의신당 ,고하정결 가내 는'치가' 의나" 출력

0,20에 "아EDCBAedcba1" 출력

  Comments,     Trackbacks