2010-04-28 2 views
3

공백을 구분 기호로 사용하여 문자열을 분할하려고합니다. 각 토큰을 배열이나 벡터에 저장하고 싶습니다.C++ 스플릿 문자열

나는 시도했다.

string tempInput; 
    cin >> tempInput; 
    string input[5]; 

    stringstream ss(tempInput); // Insert the string into a stream 
    int i=0; 
    while (ss >> tempInput){ 
     input[i] = tempInput; 
     i++; 
    } 

"이 테스트입니다"라고 입력하면 배열에 입력 [0] = "this"만 저장되는 것 같습니다. 입력 [2] ~ 입력 [4]에 대한 값을 포함하지 않습니다.

나는 또한 동일한 결과를 가진 벡터를 사용해 보았습니다. 그냥 copy를 사용하는 것이 훨씬 용이하다는

+0

하지 속는 사람을. 그것은 "어디에서 오류를 만들었습니까?"대 "가장 좋은 방법은 무엇입니까?"입니다. –

+0

질문은 정확히 똑같지 만 문자열을 분할하는 방법은 @pmr의 참조 된 질문이 일반적인 문제를 다루는 반면이 질문은 문제가 실제 나누기가 아니라고 생각합니다 –

+0

@David @SF 네, 맞아. 불행히도 대부분의 대답은 그런 식으로 문제를 다루지 않습니다. – pmr

답변

5

문자열을 단어로 분할하는 방법을 배우려면 중복 질문으로 이동하지만 방법이 실제로 올바릅니다. 실제 문제는 당신이 그것을 분리하려고 전에 입력을 읽는 방법에있다 :

string tempInput; 
cin >> tempInput; // !!! 

당신이 cin >> tempInput를 사용하는 경우에만 입력이 아닌 전체 텍스트에서 첫 번째 단어를 얻고있다.

std::string tempInput; 
std::vector<std::string> tokens; 
while (std::cin >> tempInput) { 
    tokens.push_back(tempInput); 
} 
// alternatively, including algorithm and iterator headers: 
std::vector<std::string> tokens; 
std::copy(std::istream_iterator<std::string>(std::cin), 
      std::istream_iterator<std::string>(), 
      std::back_inserter(tokens)); 

이 접근 방식은 하나의 벡터 당신에게 입력의 모든 토큰을 줄 것이다 다음 stringstream 잊고 직접 입력을 반복하는 간단한있는 것을 밖으로 길을 작업의 두 가지 방법이 있습니다 . 각 라인 작업을해야하는 경우 separatedly 당신은 대신 cin >> tempInput<string> 헤더에서 getline를 사용한다 : 정말

std::string tempInput; 
while (getline(std::cin, tempInput)) { // read line 
    // tokenize the line, possibly with your own code or 
    // any answer in the 'duplicate' question 
} 
3

주의 사항 : 코드가 작동하지 않는 이유에 대해서는

vector<string> tokens; 
copy(istream_iterator<string>(cin), 
    istream_iterator<string>(), 
    back_inserter(tokens)); 

: 당신이 tempInput를 재사용하고 있습니다. 그러지 마. 또한, 처음으로 한 단어를 cin, 이 아닌에서 전체 문자열로 읽습니다. 그렇기 때문에 한 단어 만 stringstream에 삽입됩니다.

1

가장 쉬운 방법 : Boost.Tokenizer

std::vector<std::string> tokens; 

std::string s = "This is, a test"; 
boost::tokenizer<> tok(s); 
for(boost::tokenizer<>::iterator it=tok.begin(); it != tok.end(); ++it) 
{ 
    tokens.push_back(*it); 
} 

// tokens is ["This", "is", "a", "test"] 

당신은 구분 기호를 매개하고, 기본적으로 공백 및 구두점 모두 토큰 화 할 경우에만 공간을하는 시퀀스를 탈출 할 수 있습니다.

+2

사람들이 즉시 멈추고 Boost를 해결책으로 부르기를 바랍니다. 내가 현재 어디에 있는지 (그리고 이전에 일 했었던 곳을 포함하여) 여러 장소에서 라이센스를 검토하고 사용하기 전에 _any_ 오픈 소스 프로젝트에 대한 감사를해야만합니다. 일반적으로 얻을 수있는 고통과 노력의 가치는 없습니다. 녹색 (또는 빨간색) 표시등이 켜집니다. 또한 이것이 숙제에 관한 질문이라면 학생이 넘겨 준 경우 교사는 감동을주지 않을 것입니다. –

+3

@ graham.reeds : 유감 스럽지만, 운이 좋긴하지만. 부스트는 매우 자주 ** ** 가장 적합한 솔루션입니다. 표준 라이브러리를 사용할 수 있습니까?결국 그것은 공개 표준이며 구현은 대개 오픈 소스입니다. 어쨌든 Boost 또는 유용한 답변이 아닌 귀사를 비난하십시오. :-( –

+2

@ graham.reeds : 대안은 다른 환경에서 사용할 수있는 완벽한 답변을 숨기는 것입니다. 누군가가 C++로 XML을 구문 분석하는 방법을 묻는다면 XML 파서의 구현을 제공하겠습니까? 단순한 경우에는 순수한 C++과 라이브러리 기반 솔루션을 모두 얻게 될 것이고, 필자가 생각하기에, 가치를 더할 가치가있다. (참고 : 나는지지하지 않았다. @Mike가 직면 한 실제 문제가 문자열을 토큰 화하는 것이 아니라 그가 입력을 읽는 방법이라고 생각하기 때문에) –