🧩 AfxExtractSubString()이란?

MFC에서 제공하는 AfxExtractSubString() 함수는 **특정 구분자(delimiter)**로 분리된 문자열에서 원하는 위치의 **부분 문자열(substring)**을 추출하는 유틸리티 함수다. 예를 들어 "Apple,Banana,Cherry"라는 문자열에서 인덱스 1번을 추출하면 "Banana"를 돌려준다.

함수 정의

CPP
BOOL AfxExtractSubString( CString& rString, // 결과가 저장될 CString 객체 LPCTSTR lpszFullString, // 전체 문자열 int iSubString, // 추출할 부분 문자열 인덱스 (0부터 시작) TCHAR chSep // 구분 문자 );
반환값
  • TRUE: 추출 성공
  • FALSE: 해당 인덱스가 존재하지 않아 추출 실패

📌 사용 예시

CPP
CString full = _T("Red;Green;Blue"); CString part; if (AfxExtractSubString(part, full, 1, _T(';'))) { AfxMessageBox(part); // 결과: "Green" }

🔍 내부 동작

전체 문자열을 구분자 기준으로 분리한 후 iSubString에 해당하는 인덱스의 문자열을 찾아 rString에 대입. 인덱스가 범위를 벗어나면 FALSE 반환

⚠️ 주의할 점

항목설명
인덱스는 0부터 시작
CODE
"a,b,c"
CODE
iSubString=2
CODE
"c"
공백 포함 주의
CODE
" a , b "
처럼 공백이 있을 경우 그대로 추출됨
연속 구분자 처리
CODE
"a,,c"
에서
CODE
iSubString=1
빈 문자열("")
존재하지 않는 인덱스실패 시
CODE
rString
값은 변하지 않음

🎯 활용 예제

1. CSV 문자열 파싱

CPP
CString csv = _T("1001,홍길동,서울,30"); CString name; if (AfxExtractSubString(name, csv, 1, _T(','))) { AfxMessageBox(_T("이름: ") + name); }

2. 구분자 기반 설정 문자열 분리

CPP
CString config = _T("DEBUG:TRUE;LOG:ON;VERSION:1.2"); CString pair; for (int i = 0; AfxExtractSubString(pair, config, i, _T(';')); i++) { AfxMessageBox(pair); }

🔄 대체 사용법: CString::Tokenize()

MFC 7.0 이상에서는 더 유연한 **CString::Tokenize()**도 사용할 수 있다:
CPP
CString str = _T("Cat|Dog|Bird"); int curPos = 0; CString token = str.Tokenize(_T("|"), curPos); while (!token.IsEmpty()) { AfxMessageBox(token); token = str.Tokenize(_T("|"), curPos); }
비교 항목
CODE
AfxExtractSubString
CODE
Tokenize
랜덤 접근가능 (인덱스로)불가
순차 처리반복문 필요편리함
반환 방식BOOL빈 문자열 확인
가독성간단유연함

✅ 정리

항목내용
목적구분자로 분리된 문자열에서 부분 문자열 추출
핵심 인자전체 문자열, 인덱스, 구분자
반환값성공 여부 (TRUE / FALSE)
활용처설정값 파싱, 로그 처리, CSV 데이터 등
AfxExtractSubString()은 작지만 꽤 유용한 함수로, 특정 위치의 토큰만 빠르게 추출하고 싶은 경우에는 Tokenize()보다 더 간결하고 명확한 대안이다.
"작은 유틸 하나가 코드의 간결함을 좌우한다."