QT에서는 아주 다양한 문자열 처리 매서드들이 제공되는데 반해서 MFC에서는 가리는 것이 너무 많다. 그래서 이것저것 문자열을 처리하는데 필요한 내용을 정리해둔다.
---------- 목차 -------------------------
1. 문자(CString)를 숫자(int로)
2. 문자열 자르기(AfxExtractSubString)
3. 문자열의 공백 제거(CString.Remove())
4. CString에서 TCHAR로, TCHAR에서 CString으로 변경
5. 문자열 변환 매크로 : CW2A / CT2A / CA2T / CA2W
------------------------------------------
1. 문자(CString)를 숫자(int로)
워낙 많은 방법이 존재하는데.. 그리고 검색도 잘 되는데... 되는게 그렇게 많지는 않은 MFC..이다.
Visual Studio의 문자열 설정에 따라 CString은 LPCTSTR또는 LPCSTR로 처리될 수 있다. LPCTSTR즉, const wchar_t * 를 나타낸다. 다시말해 유니코드 문자열을 의미한다. 이 문자열의 처리를 위해서는 _wtol 이나 wtof 등을 통해 변경할 수 있다. 그리고 const char*는 LPCSTR이라하며 atoi나 atof등을 이용하여 변경할 수 있다.
만약 리소스를 콤보박스를 이용한다고 가정하자. 사용자로부터 문자열을 받아와서 해당 콤보박스를 선택하게 하려면 다음과 같이 이용할 수 있다.
CString strInspectionType="12"; //사용자로 부터 받은 값 (유니코드)
int selInspectionType = _wtoi(strInspectionType); // 정수로 변경
m_myComboBox.SetCurSel(selInspectionType); // 콤보박스 셋팅 변경
2. 문자열 자르기(AfxExtractSubString)
C/C++의 strtok토큰(특정문자)을 기준으로 서브 문자열을 추출 하는 함수로 스레드 이용시 안전하지 않은 함수이다. 그래서 strtok_s와 같이 스레드에 안전한 함수를 주로 사용한다
MFC에서도 이와 유사한 기능의 API를 제공하고 있다. 해당 API는 AfxExtractSubString()이며 아래와 원형은 아래와 같다.
BOOL AFXAPI AfxExtractSubString(
CString& rString, // 결과 문자 포인터
LPCTSTR lpszFullString, // 토큰이 포함된 전체 텍스트(소스)
int iSubString, // 분리자를 기준으로 몇째인지 카운트
TCHAR chSep = '\n' // 분리자로 디폴트는 \n으로 설정된다.
);
간단한 예제는 아래와 같다.
CString srcStr = _T("Hello World and Earth");
CString subStr;
int repi=0;
// 전체 메시지 출력
AfxMessageBox(srcStr);
// 잘라낸 메시지 출력
while(AfxExtractSubString(subStr, srcStr, i++, ' ') )
{
AfxMessageBox(subStr);
}
3. 문자열의 공백 제거(CString.Remove())
텍스트에디트 컨트롤에 사용자가 문자열을 입력했는데, 해당 값을 저장하기 위해서 공백을 제거한다던지 하는 경우에 사용할 수 있는 간단한 예시로, 전화번호 입력받고 하이픈 제거용으로 사용하면 편리하다.
CString myString="I am a boy."
myString.Remove(' ');
4. CString에서 TCHAR로, TCHAR에서 CString으로 변경
CString strMyString="Hello World.";
TCHAR * tCharString = NULL;
tCharString=(TCHAR*) (LPCTSTR)strMyString;
TCHAR *tCharString="Hello Earth.";
CString strYourString;
strYourString.Format("%s",tCharString);
// 또는
strYourString = (LPCTSTR)tCharString;
5. 문자열 변환 매크로 : CW2A / CT2A / CA2T / CA2W
문자열 변환 매크로이다. 몇번 썼던거 같은데 예시가 정리되어있지 않아 관련 내용만 남긴다.
매크로 | 기능 |
CW2A | 와이드 캐릭터를 멀티바이트로 만들때 사용 |
CT2A | T매크로가 되어있는 캐릭터를 멀티 바이트로 만들때 사용 |
CA2T | 멀티 바이트를 T매크로용으로 만들때 사용 |
CA2W | 멀티 바이트를 와이드 캐릭터루 만들때 사용 |
6. CString to Char*
MFC 프로젝트를 유니코드(디폴트)로 생성했을 때 가장 애먹는 부분중 하나인 CString to Char*이다. 예전에 정말 애먹었었던 내용인데, 정리된게 없어서 추가하였다.
void CmyClassDlg::fxConvertStrToChar(CString src, char* pDest)
{
//형변환할 문자열이 저장된 CString 변수
wchar_t* wchar_str; //첫번째 단계(CString to wchar_t*)를 위한 변수
char* char_str; //char* 형의 변수
int char_str_len; //char* 형 변수의 길이를 위한 변수
//1. CString to wchar_t* conversion
wchar_str = src.GetBuffer(src.GetLength());
//2. wchar_t* to char* conversion
//char* 형에 대한길이를 구함
char_str_len = WideCharToMultiByte(CP_ACP, 0, wchar_str, -1, NULL, 0, NULL, NULL); char_str = new char[char_str_len]; //메모리 할당
//wchar_t* to char* conversion
WideCharToMultiByte(CP_ACP, 0, wchar_str, -1, char_str, char_str_len, 0,0);
//Done.
memcpy(pDest, char_str,char_str_len);
}
7. Char* to CString
앞의 6번의 반대역할을 한다.
CString CMyClassDlg::convChar2String(char* value)
{
// Unicode char* -> CString 변환 과정
// char* -> wchar* -> CString 순서로 변환 되어야 함
int len;
CString str;
BSTR buf;
// 1. char* to wchar * conversion
len = MultiByteToWideChar(CP_ACP, 0, value, strlen(value), NULL, NULL);
buf = SysAllocStringLen(NULL, len);
MultiByteToWideChar(CP_ACP, 0, value, strlen(value), buf, len);
// 2. wchar_t* to CString conversion
str.Format(_T("%s"), buf);
return str;
}
언젠가는 쓸 일이 있겠지라며... 오늘도 기록을 남깁니다.
최근댓글