2012-10-19 4 views
14

가능한 중복 :
Splitting a string in C++C++에서 PHP의 explode() 함수와 동일한 기능이 있습니까?

은 PHP, 상기 explode() 함수는 문자열 걸리며 지정된 분리하여 각 분리 요소 배열로 그것을 들어온다.

C++에는 동일한 기능이 있습니까?

#include <string> 
#include <vector> 
#include <sstream> 
#include <utility> 

std::vector<std::string> explode(std::string const & s, char delim) 
{ 
    std::vector<std::string> result; 
    std::istringstream iss(s); 

    for (std::string token; std::getline(iss, token, delim);) 
    { 
     result.push_back(std::move(token)); 
    } 

    return result; 
} 

사용법 :

auto v = explode("hello world foo bar", ' '); 

참고 : 출력 반복자에 쓰기 제리의 생각은 C 더 관용적 인 @ ++

+1

아니요, 그렇지만 자체 구현을 작성하기는 쉽습니다. –

+1

[boost/algorithm/string.hpp]의 boost :: split' (www.boost.org/doc/html/string_algo.html) – Praetorian

+0

@KerrekSB이 문제가 해결되기 전에 답변을 작성해야한다고 생각합니다. –

답변

28

다음은 간단한 예제 구현입니다. 사실, 둘 다 제공 할 수 있습니다. 출력 반복기 템플릿 및 최대 유연성을 위해 벡터를 생성하는 래퍼가 포함됩니다.

주 2 : 빈 토큰을 건너 뛰려면 if (!token.empty())을 추가하십시오.

+0

이 경우 std :: move가 수행하는 작업은 무엇입니까? 그게 필요 할까? 나는 C++ 11을 사용하지 않았기 때문에 컴파일하지 않고 컴파일했다. 그러나이 경우 목적은 무엇입니까? –

+4

@ user1944429 : 이동하면 문자열 데이터가 복사되지 않습니다. 루프 내부에서 더 이상 사용할 수 없으므로 벡터가 벡터를 복사하지 않고 직접 "도용"하는 것이 좋습니다. –

+0

입력 시나리오가 "a, b, c, d"인 경우를 놓친 경우 마지막 null을 포함하여 5 개의 값을 반환해야하지만 –

11

표준 라이브러리에는 직접적으로 동일한 기능이 없지만 작성하는 것은 매우 쉽습니다. C++이기 때문에 일반적으로 배열에 특별히 쓰고 싶지는 않습니다. 보통 반복자에 출력을 써서 배열, 벡터, 스트림 등으로 갈 수 있습니다. 이 일반 주문의 내용 :