🧩 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()보다 더 간결하고 명확한 대안이다.
"작은 유틸 하나가 코드의 간결함을 좌우한다."