ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Cstring 토큰 분리
    개발/지름 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;
    }
    반응형

    댓글

Designed by Tistory.