본문 바로가기

Programming/Win32&MFC&COM

CString 토큰(Token)으로 분리시키기(AfxExtractSubString)

반응형

C/C++에는 기본적으로 C의 strtok을 통해서 토큰으로 문자열 분리가 가능합니다.

토큰(Token)이라는 지정된 문자를 기준으로 문자열을 쪼개면서 추출이 가능합니다.

만약 문자열이 "Hello#World"이고 토큰이 '#'이면 다음과 같이 결과를 얻을 수 있습니다.

Hello

World

MFC에서도 동일한 기능의 함수가 제공됩니다.

AfxExtractSubString() 함수를 통해서 동일한 기능을 제공합니다.

먼저 strtok()은 몇 가지 문제점을 가지고 있습니다.

원본이 훼손되며 thread-safe하지 않다는 점입니다.

strtok()은 두 번째 호출부터는 NULL을 전달합니다.

토큰의 위치를 식별하기 위해서 별도의 static 변수를 관리하고 있기 때문입니다.

이 변수로 인해서 strtok()을 동시에 쓰면 의도하지 않은 결과를 발생시키게 됩니다.

물론 윈도우에서는 strtok_s(), 리눅스에서는 strtok_r()이라는 thread-safe한 버전이 존재합니다.

기본적으로 윈도우는 _s가 붙은 함수가 쓰는 것을 권장합니다.

MFC에서는 AfxExtractSubString()을 사용하면 되는데 사용법은 다음과 같습니다.

AfxExtractSubString() 함수의 원형은 다음과 같습니다.

BOOL AFXAPI AfxExtractSubString(
       CString& rString,
       LPCTSTR lpszFullString,
       int iSubString,
       TCHAR chSep = '\n'
);

먼저 두 번째 파라미터에 전체 문자열을 입력합니다.

세 번째는 토큰을 기준으로 몇 번째 부분 문자열인지를 지정합니다.

위의 경우에는 0일 때 Hello, 1일 때 World를 받을 수 있습니다.

마지막은 토큰을 지정합니다.

디폴트 인자로 '\n'이 지정되어 있고 원하는 값으로 변경하면 됩니다.

그리고 첫 번째 인자인 rString을 통해서 결과를 받을 수 있습니다.

CString 타입의 변수를 넣어주면 됩니다.

분리가 성공할 경우는 TRUE를, 실패할 경우는 FALSE를 리턴합니다.

MFC에서의 사용 예제는 다음과 같습니다.

void CMFCApplication3Dlg::TestFunc()
{
	CString szFull = _T("Hello World And Guys");
	CString szSub;
	int i = 0;
	
	while (FALSE != AfxExtractSubString(szSub, szFull, i++, ' '))
	{
		AfxMessageBox(szSub);
	}
	AfxMessageBox(szFull);
}

정상적으로 문자열이 분리가 되며 마지막에 전체 문장 역시 보존되있는 것을 확인할 수 있습니다.

반응형