본문 바로가기
Software/C++&MFC

[C++/MFC] CString 다양한 기능들 정리

by lovey25 2018. 12. 3.
반응형

CString은 MFC에서 문자열을 처리를 아주 쉽게 처리할 수 있도록 제공해주는 클래스라서 내장된 기능이 어마어마 합니다. 사용법만 알면 간단히 사용할 수 있도록 만들어 두었는데 그 내부를 보면 사용하는것 만큼 간단하지는 않습니다. 그 많은 기능들을 최적화해서 (물런 네이티브 문자열 처리에 비해 속도가 느리기는 함) 제공하기 위해서는 상당히 복잡한 구조로 되어있습니다. 언제나 처럼 저는 복잡한 내부구조는 관심없고, 쉽게 쓸수만 있으면 그만입니다. ㅎ

문자를 자르고 붙이고 뭐 이런건 이본이고 그외에도 다양한 기능을 CString 자체에서 할수 있으니 MFC를 사용한다면 어떤 기능들이 있는지 알아둘 필요는 있을 것 같습니다.

다는 아니지만 음 이정도는 내가 써볼만 하겠다 하는 기능들만 모아봤습니다.

 

CString 사용법

문자열로 CString 개체 만들기

문자열 값을 할당해서 CString 개체를 만들수 있습니다. 가장 기본적인 사용방법중 하나이죠.

// 방법 1 
CString myString = _T("This is a test");  
// 방법 2 
CString oldString = _T("This is a test"); 
CString newString = oldString; 

Cstring의 개별문자에 접근 : GetAt(), SetAt()

"GetAt", "SetAt"의 메서드는 문자에 접근 할 수 있도록 해줍니다.

"GetAt"은 문자를 읽어오는 역할을 하며 인수로 숫자를 넣어서 몇번째 문자를 가져올지 지정합니다.

"SetAt"은 반대로 지정위체에 문자를 집어넣습니다. 그래서 인수로 위치값의 숫자와 바꿀 문자값 2개를 받습니다.

CString str_mystring = _T("this is my string!!");     // 객체 생성 
CSting result = str_mystring.GetAt(18);               // 18번째 문자 !를 가진 CString 객체 생성 
str_mystring.SetAt(18, '?' );                         // str_mystring의 18번째 !를 ?로 변경 

CString 개체 연결 : +, +=

연결 연산자(+, +=)를 이용해서 여러개의 CString 개체를 연결할 수 있습니다.

CString s1 = _T("This "); 
s1 += _T("is a "); 
CString s2 = _T("test"); 
CString message = s1 + _T("big ") + s2;  // s1의 최종 결과: This is a big test 

CString 개체를 비교 : Compare(), CompareNoCase()

관계형 연산자 (<, <=, >=, >, =, =, !=)를 사용하여 두 값을 비교할 수 있습니다.

CString비교 함수와 C 런타임 라이브러리에서 해당하는 유니코드/MBCS의 비교함수는 다음과 같습니다.

CString   유니코드 MBCS 
 Compare wcscmp  _mbscmp 
 CompareNoCase _wcsicmp  _mbsicmp 
 Collate wcscoll _mbscoll  

CString을 C스타일의 null로 종료되는 문자열로 사용

CString 개체를 C스타일 문자열로 변환해서 사용할 수 있습니다. 코딩을 하다보니 이것도 자주 사용하게 되더라구요. 단, LPCTSTR타입으로 캐스팅해서 사용해야 합니다. 

예제에서 CString은 C스타일의 null로 종료되는 읽기전용 문자열에 대한 포인터를 반환합니다. strcpy 함수는 C 스타일 문자열 복사본을 myString 변수에 저장합니다.

CString aCString = "A string";   
char myString[256];   
strcpy(myString, (LPCTSTR)aCString);   

CString 복사본을 직접 수정해야 하는 경우도 있는데, strcpy_s/_tcscpy_s 함수를 사용해서 CString 개체를 별도의 버퍼에 복사해서 사용합니다. 다음 예제 참고하세요.

CString theString(_T("This is a test")); 
int sizeOfString = (theString.GetLength() + 1); 
LPTSTR lpsz = new TCHAR[sizeOfString]; 
_tcscpy_s(lpsz, sizeOfString, theString);   // lpsz에서 필요한 수정을 진행하세요 

strcpy_s / _tcscpy_s의 세 번째 인수는 const``wchar_t*(유니코드) 혹은 const``char*(ANSI)인데 여기 예제에서는 CString을 전달했습니다. (컴파일러가 CString을 LPCTSTR로 자동 적용한다고 하네요. 참고할 만한 내용인것 같습니다.)

CString 콘텐츠 직접 수정 : GetBuffer(), ReleaseBuffer()

CString개체의 문자를 수정해야 할 때 앞에서 제시했던 C형의 문자열로 변환해서 사용하거나 CString의 자체 메서드를 사용해서 변환해야 하는데 문자 버퍼가 직접적으로 필요한 경우에는 다음과 같이 직접 수정할 수도 있습니다.

GetBuffer 및 ReleaseBuffer 메서드는 CString 개체의 내부문자 버퍼에 접근해서 해당 버퍼를 직접 수정할 수 있도록 해 줍니다.

CString 개체의 내부 문자 버퍼에 액세스하려면 CString 개체에 대해 GetBuffer를 호출하고 필요한 버퍼 길이를 지정합니다. 이때 GetBuffer의 반환값은 당연히 "LPTSTR" 입니다.

포인터를 이용한 CString 개체 수정

포인터를 이용한 방법이라는게 정확한 표현인지는 모르겠지만 어떤 코드를 보다가 이런 방법으로도 CString을 사용할 수 있구나 해서 가져왔습니다.

CString my_string = _T("this is my string!!"); 
LPTSTR begin_string = my_string.GetBuffer(0); 
CString result(begin_string, 4);

특정 포인터에서 필요한 길이만큼만 가져와서 개체로 만들어 줄수도 있네요.

문자 및 문자열 검색 : Find()

CString 문자열 안에서 특정 문자나 문자열을 검색하는 기능입니다.

Find/ReverseFind 함수를 사용하며 두함수의 차이는 함수이름처럼 문자열의 앞에서 검색을 할지 뒤에서 검색을 할지 검색의 시작점 입니다.

찾는 문자가 없으면 "-1"을 반환하고, 찾은 경우는 0 ~ (문자열 길이-1) 중 하나의 숫자를 반환합니다.

// 예제1 CString::Find (TCHAR ch) 
CString s("abcdef"); 
ASSERT(s.Find('c') == 2); 
ASSERT(s.Find(_T("de")) == 3);  
// 예제2 CString::Find(TCHAR ch, int nStart) 
CString str("The stars are aligned"); 
int n = str.Find('e', 5); 
ASSERT(n == 12);

문자열 카운트 : GetLength()

GetLength함수는 CString에 담겨있는 문자열 길이를 숫자로 반환해 준다.

 

앞으로 공부하면서 유용한 기능을 알게되면 계속 추가하도록 하겠습니다.

끝!

반응형

댓글