2008. 10. 29. 18:51

[MFC]문자열 파싱 함수

반응형
MFC를 사용하다보면 구분자로 이루어진 문자열을 파싱해야 하는 경우가 종종 생긴다.

이때에 새로 루틴을 만드느라 시간을 낭비하는 경우가 있다.

MFC 라이브러리 내에 문자열을 파싱하는 쓰기 편한 함수가 있다.

다음은 그 함수의 구현부이다.

BOOL AFXAPI AfxExtractSubString(CString& rString, LPCTSTR lpszFullString,
int iSubString, TCHAR chSep)
{
if (lpszFullString == NULL)
return FALSE;

while (iSubString--)
{
lpszFullString = _tcschr(lpszFullString, chSep);
if (lpszFullString == NULL)
{
rString.Empty(); // return empty string as well
return FALSE;
}
lpszFullString++; // point past the separator
}
LPCTSTR lpchEnd = _tcschr(lpszFullString, chSep);
int nLen = (lpchEnd == NULL) ?
lstrlen(lpszFullString) : (int)(lpchEnd - lpszFullString);
ASSERT(nLen >= 0);
memcpy(rString.GetBufferSetLength(nLen), lpszFullString, nLen*sizeof(TCHAR));
return TRUE;
}

이 함수는 MSDN에서 아무리 찾으려고 해도 찾을수가 없다. 

아마도 도움말을 제작하는 과정에서 빠뜨린듯하다.

이 함수를 호출하여 디버그 모드에서 step into(F11) 로 들어가면 볼 수 있다.

C++에도 이와 유사한 함수인 strtok이라는 함수가 있다. 여기까지는 퍼온 글이고
내가 이해하기 쉬운 예제를 넣어봐야지

CString str = "192.168.0.1";
CString strA, strB, strC, strD;
AfxExtractSubString(strA, str, 0, '.'); // strA == "192"
AfxExtractSubString(strB, str, 0, '.'); // strB == "168"
AfxExtractSubString(strC, str, 0, '.'); // strC == "0"
AfxExtractSubString(strD, str, 0, '.'); // strD == "1"

위와 같이 나온다.

물론 Win32에 strtok() 함수가 있기는 하지만 MFC 환경에서 작업을 많이하는 요즘에는
AfxExtractSubString() 함수가 더 유용해 보인다.
strtok() 함수도 다음글에 적어본다.
반응형