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); }
정상적으로 문자열이 분리가 되며 마지막에 전체 문장 역시 보존되있는 것을 확인할 수 있습니다.
'Programming > Win32&MFC&COM' 카테고리의 다른 글
MFC 사용자 정의 메시지 처리 (2) | 2015.06.24 |
---|---|
SDI Document/View 구조 제거하기 (1) | 2015.06.23 |
BOM(Byte Order Mark)에 따른 파일 처리 (0) | 2015.06.21 |
DLL 파일만 있을 때, lib 파일 생성하기 (0) | 2015.06.20 |
Vista 이후 OS에서 Mic, Speaker 볼륨 셋팅 (2) | 2015.06.19 |