본문 바로가기
C++

std::string Split

by leo21c 2016. 4. 26.

<참고>
http://stackoverflow.com/questions/5167625/splitting-a-c-stdstring-using-tokens-e-g?answertab=votes#tab-top

std::string을 split 하는 방법을 찾다가 이 방법이 가장 좋은 것 같아 글을 남긴다.
추후에도 많이 사용할 것 같다.

#include <sstream> 
#include <iostream> 
#include <vector>  
using namespace std;  
int main() 
{     
	vector<string> strings;     
	istringstream f("denmark;sweden;india;us");     
	string s;         
	while (getline(f, s, ';')) 
	{         
		cout << s << endl;         
		strings.push_back(s);     
	}
}
QT의 QString의 split 함수가 사용하기 가장 편한 것 같고 MFC도 나름 AfxExtractSubString 함수를 이용하면 된다.
AfxExtractSubString 함수 설명은 

헤더 afxwin.h
AfxExtractSubString
이 전역 함수는 지정된 소스 문자열에서 부분 문자열을 추출하는 데 사용할 수 있습니다.

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

[매개 변수]
rString: 개별 부분 문자열을 CString 받을 개체에 대한 참조입니다.
lpszFullString : 추출할 문자열의 전체 텍스트를 포함하는 문자열입니다.
iSubString : 에서 lpszFullString추출할 부분 문자열의 인덱스(0부터 시작하는 인덱스)입니다.
chSep: 부분 문자열을 구분하는 데 사용되는 구분 기호 문자입니다.

 

[반환 값]
TRUE함수가 제공된 인덱스에서 부분 문자열을 성공적으로 추출한 경우 그렇지 않으면 . FALSE

[설명]
이 함수는 알려진 단일 문자가 각 부분 문자열을 구분할 때 원본 문자열에서 여러 부분 문자열을 추출하는 데 유용합니다. 이 함수는 호출할 때마다 매개 변수의 lpszFullString 시작 부분에서 검색합니다.

이 함수는 NULL 지정된 구분 기호 문자가 +1개나 없으면 lpszFullString 함수가 끝에 lpszFullStringiSubString도달하면 반환 FALSE 됩니다. 매개 변수가 rString 원래 값으로 설정된 NULL경우 lpszFullString 수정되지 않습니다. 그렇지 않으면 rString 지정된 인덱스에서 부분 문자열을 추출할 수 없는 경우 매개 변수가 빈 문자열로 설정됩니다.

// The following example extracts a series of name, value pairs from a
// given source string:

// Input string consisting of a number of name, value pairs
LPCTSTR lpszSource = _T("\"Name\"=\"John Smith\"\n")
_T("\"Company\"=\"Contoso, Ltd\"\n\"Salary\"=\"25,000\"");

CString strNameValue; // an individual name, value pair

int i = 0; // substring index to extract
while (AfxExtractSubString(strNameValue, lpszSource, i))
{
   // Prepare to move to the next substring
   i++;

   CString strName, strValue; // individual name and value elements

   // Attempt to extract the name element from the pair
   if (!AfxExtractSubString(strName, strNameValue, 0, _T('=')))
   {
      // Pass an error message to the debugger for display
      OutputDebugString(_T("Error extracting name\r\n"));
      continue;
   }

   // Attempt to extract the value element from the pair
   if (!AfxExtractSubString(strValue, strNameValue, 1, _T('=')))
   {
      // Pass an error message to the debugger for display
      OutputDebugString(_T("Error extracting value element\r\n"));
      continue;
   }

   // Pass the name, value pair to the debugger for display
   CString strOutput = strName + _T(" equals ") + strValue + _T("\r\n");
   OutputDebugString(strOutput);
}