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;
    }

     

     

     

     

    언젠가는 쓸 일이 있겠지라며... 오늘도 기록을 남깁니다.

     

     

     

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기