메뉴 건너뛰기


Computer Science > Language Processing
 
3장. 윈도우즈(C++)에서 문자열 사용법 2부
       (basic_string, CString)
 
 
1. STL(Standard Template Library) 문자열 클래스
 
STL에는 문자열을 처리하기 위한 basic_sting 클래스가 있습니다.
뭐 꼭 문자열만을 위해서 사용하는 것은 아니겠지만 어찌되었건 basic_string으로 문자열을 처리할 수 있습니다.
basic_string 템플릿의 인자로 사용할 데이터 타입을 넘겨서 사용합니다.
 
1) basic_string 클래스
 
basic_string을 사용하기 편리하도록 이미 다음과 같이 string과 wstring이 정의되어 있습니다.
 
typedef basic_string<char, char_traits<char>, allocator<char> > string;
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
 
보시면 string은 LPSTR형을 wstring은 LPWSTR형을 사용하기 위해 정의되어 있습니다.
LPTSTR형은 정의되어 있지 않습니다. 하지만 우리는 이미 많은 것을 공부했으니깐 응용도 가능하겠네요. 다음과 같이 정의하면 됩니다.
 
typedef basic_string<TCHAR, char_traits<TCHAR>, allocator<TCHAR> > tstring;
 
basic_string은 특징이라기 보다는 제약 사항이 있는데 그 것들은 다음과 같습니다.
 
- basic_string은 다른 문자열 클래스나 타입로 형변환이 바로 되질 않습니다. 이런 이유로 멤버함수인 c_str()함수를 사용해서 문자열을 꺼내서 사용해야 합니다
- c_str()함수를 이용하여 LPSTR형태의 포인터를 얻었더라도 이를 직접 수정하는 것은 문제가 일어날 소지가 있습니다. basic_string내의 문자열 조작함수를 사용하여야 합니다. 
 
다음과 같은 형태로 사용할 수 있습니다.
 
#include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include &lt;comdef.h&gt; // FOR _bstr_t class LPCSTR Uni2Multi(LPCWSTR wstr) { static char str[1024]; WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, 1024, NULL, NULL); return str; } #include &lt;string&gt; // FOR basic_string using namespace std; // FOR basic_string typedef basic_string&lt;TCHAR, char_traits&lt;TCHAR&gt;, allocator&lt;TCHAR&gt; &gt; tstring; int main(int argc, char *argv[]) { // string에 LPCSTR 대입 string string1 = "가나다"; LPCSTR str = string1.c_str(); printf("str: %s\n", str); // wstring에 LPCWSTR 대입 wstring wstring1 = L"마바사"; LPCWSTR wstr = wstring1.c_str(); printf("wstr: %s\n", Uni2Multi(wstr)); // string에 LPCTSTR 대입 // 참고로 현재 UNICODE 메크로를 정의하지 사용하고 있음 tstring tstring1 = __TEXT("아자차"); LPCTSTR tstr = tstring1.c_str(); printf("tstr: %s\n", tstr); // _bstr_t 객체에 대입도 가능함 _bstr_t bstring1 = string1.c_str(); printf("bstring1: %s\n", Uni2Multi(bstring1)); _bstr_t bstring2 = wstring1.c_str(); printf("bstring2: %s\n", Uni2Multi(bstring2)); return 0; }
 
 위의 코드를 실행하면 다음과 같은 결과가 나타납니다.
str: 가나다 wstr: 마바사 tstr: 아자차 bstring1: 가나다 bstring2: 마바사
 
 
2. MFC(Microsoft Foundation Class) 문자열 클래스
 
너무나 유명한 MFC의 문자열 클래스인 CString에 대해서 설명할 차례가 왔습니다.
 
1) CString 클래스
 
CString은 내부적으로 TCHAR형을 랩핑한 것이기 때문에 컴파일시에 정확한 형이 정해지게 됩니다.
 
CString은 다음과 같은 특징을 갖습니다.
 
- char*와 wchar_t*를 모두 수용합니다.
- LPCTSTR문자열로 형변환이 가능합니다.
 
다음과 같은 코딩이 가능합니다.
 
#include &lt;afx.h&gt; #include &lt;stdio.h&gt; #include &lt;windows.h&gt; #include &lt;comdef.h&gt; #include &lt;atlbase.h&gt; LPCSTR Uni2Multi(LPCWSTR wstr) { static char str[1024]; WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, 1024, NULL, NULL); return str; } int main(int argc, char* argv[]) { // CString에 LPCSTR를 대입 CString s1="가나다"; printf("s1=%s\n", s1); // CString에 LPWCSTR를 대입 CString s2=L"라마바"; printf("s2=%s\n", s2); // CString에 BSTR을 대입 BSTR bstr1=SysAllocString(L"사아자"); CString s3=bstr1; printf("s3=%s\n", s3); SysFreeString(bstr1); // CString에 VARIANT를 대입 VARIANT var; V_VT(&amp;var) = VT_BSTR; V_BSTR(&amp;var) = SysAllocString(L"차카타"); CString s4=V_BSTR(&amp;var); printf("s4=%s\n", s4); SysFreeString(V_BSTR(&amp;var)); // CString의 BSTR형 문자열 생성 함수 사용 CString s5="파하가"; BSTR bstr2=s5.AllocSysString(); s5.SetSysString(&amp;bstr2); printf("s5%s\n", s5); SysFreeString(bstr2); return 0; }
 
위의 코드의 실행에 의해 다음과 같은 결과가 출력됩니다. 
 
s1=가나다 s2=라마바 s3=사아자 s4=차카타 s5=파하가
 
 CString을 사용할 때 한가지 주의 할 점은 CString을 LPCTSTR로 형변환 한 후 LPTSTR로 형변환 해서 이를 수정하는 것은 위험합니다. 이런 경우는 멤버 함수인 GetBuffer()를 이용하여 메모리 자체를 얻어 와야서 사용해야 합니다.
 
CString s= _T("ABC");
LPTSTR str=s.GetBuffer(0);
//str사용
s.ReleaseBuffer();
 
참고로 GetBuffer의 인자로 0을 넘기면 현재 CString의 문자열과 같은 크기의 메모리를 참게 되고 특정 숫자를 적으면 그 만큼의 바이트 공간의 메모리를 잡게 됩니다.
 
 
3. WTL(Windows Template Library) 문자열 클래스
 
1) CString 클래스
 
WTL의 CString클래스는 MFC의 CString과 똑 같기 때문에 다른 설명은 하지 않겠습니다.
MFC의 CString을 참조하세요.

 
Creative Commons License
Creative Commons License이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Copyright 조희창(Nicholas Jo). Some rights reserved. http://bbs.nicklib.com