개발/지름

Cstring 토큰 분리

Tertis 2007. 11. 10. 20:41
반응형

MSDN에는 없는 AfxExtractSubString 함수

-함수원형


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


-사용법
Param1: 목적 문자열
Param2: 소스 문자열
Param3: 구하고자 하는 부분의 인덱스
Param4: 구분자


CString strSource , strRoot, strFile;


strSource = "C:\\Windows\\Temp\\abc.txt";


AfxExtractSubString(strRoot, strSource, 0, "\n");


AfxExtractSubString(strFile, strSource, 3, "\n");


Result :

strRoot= "C:"
strFile = "abc.txt"

////////////////////////////////////////////////////////////////////////////////////////

<개요>
MFC에서 간단하게 토큰을 분리해주는 함수


<원형>
BOOL AFXAPI AfxExtractSubString(CString& rString, LPCTSTR lpszFullString, int iSubString, TCHAR chSep)


<인자들>
CString& rString : 추출된 스트링을 리턴받음.
LPCTSTR lpszFullString : 구분자로를 포함하는 원본 스트링.
int iSubString : 몇번째 토큰인가?
TCHAR chSep : 구분자(없으면 Default로 '\n')


<사용예>
CString strTest;
CString strFullString = "I| am| Test"; //Delimiter로 '|'를 사용.

::AfxExtractSubString(strTest, strFullString, 0, '|');
=> strTest == I
::AfxExtractSubString(strTest, strFullString, 1, '|');
=> strTest == am
::AfxExtractSubString(strTest, strFullString, 2, '|');
=> strTest == Test
::AfxExtractSubString(strTest, strFullString, 1, '|');
=> strTest == NULL


<AfxExtractSubString는 어떻게 생겼나>

* WINSTR.CPP 에 있고 아래같이 생겼다.


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;
}
반응형