2011-11-16 4 views
1

메신저에서 strtok()의 토큰을 얻으려고하는 중입니다. 1 개의 구분 기호 (예 : token = strtok(auxiliar,"[,]");)를 사용하면 매우 간단합니다. 이 함수는 [, , 또는 ]을 찾을 때마다 auxiliar을 자릅니다.함수 strtok에있는 구분 기호의 시퀀스

내가 원하는 것은 다음과 같은 구분 기호 시퀀스를 사용하여 토큰을 얻는 것입니다. [,] strtok 기능으로 그렇게 할 수 있습니까? 나는 길을 찾을 수 없다.

감사합니다.

+0

당신은 구분 기호의 배열을 전달, 그리고 어느 하나에'strtok' 토큰 화를 갖고 싶어한다는 것을 의미합니까 그들? –

+0

사실, 아니, 그 뜻은 반대입니다. 'strtok'이'[,]'를 ** 단일 ** 분리 문자로 취급하고 싶습니까? –

+0

단지 C 함 수와'strtok'을 C++에서 사용하지 마십시오. 함정이 너무 많아서 파괴적입니다. 'string'과'find'를 사용하십시오. –

답변

-1

내가이 당신이하고 싶은 일을 할 것이라고 생각 부스트 라이브러리를 사용할 수있는 경우 - 귀하의 질문에 조금 불분명으로

#include <iostream> 
#include <vector> 
#include <string> 

#include <boost/tokenizer.hpp> 

int main(int argc, char *argv[]) 
{ 
    std::string data("[this],[is],[some],[weird],[fields],[data],[I],[want],[to],[split]"); 

    boost::tokenizer<boost::char_separator<char> > tokens(data, boost::char_separator<char>("],[")); 

    std::vector<std::string> words(tokens.begin(), tokens.end()); 

    for(std::vector<std::string>::const_iterator i=words.begin(),end=words.end(); i!=end; ++i) 
    { 
     std::cout << '\'' << *i << "'\n"; 
    } 
    return 0; 
} 

이 다음과 같은 출력을 생성하지만 완전히 확실하지를

'this' 
'is' 
'some' 
'weird' 
'fields' 
'data' 
'I' 
'want' 
'to' 
'split' 
+0

그 문자'[,]'는'[,]'시퀀스가 아니라 구분 기호로 취급됩니다. –

+0

어쨌든 외부 라이브러리를 사용할 수 없습니다. ( – Urien

+0

@Urien - 부끄러움 - 부스트가 유용합니다 - 그리고 이것에 대한 헤더 파일 :-) –

2

strtok으로 [,] 토큰으로 처리하려면이 작업을 수행 할 수 없습니다. strtok은 분리. 자열에서 전달하는 모든 것을 항상 1 자의 분리. 자로 취급합니다.

이 외에도 C++에서는 strtok을 사용하지 않는 것이 가장 좋습니다. 재 입력 (예 : 호출을 중첩 할 수 없음), 유형 안전이 아니며, 불쾌한 버그를 만드는 방식으로 사용하기가 쉽습니다.

가장 간단한 해결책은 루프 내에서 원하는 구분 기호로 std::string을 검색하는 것입니다. 보다 정교한 기능이 필요한 경우 Boost 라이브러리에 토큰 화 프로그램이 있으며 표준 라이브러리 인 here 만 사용하여보다 포괄적 인 토큰 화 작업을 수행하는 코드도 게시했습니다.

위의 코드는 구분 기호를 단일 문자로 처리하지만 코드가 원하는 방식으로 확장 될 수 있다고 생각합니다.

+0

젠장,이게 내가 원하는거야. 나는 그것을 지금 시도 할 것이다. 감사!!!!!! – Urien

0

새로운 C++ 11 기능을 사용할 수 있으면 정규식 및 토큰 반복기를 사용하여 수행 할 수 있습니다. 예를 들면 다음과 같습니다.

regex reg("\[,\]"); 
const sregex_token_iterator end; 
string aux(auxilar); 
for(sregex_token_iterator iter(aux.begin(), aux.end(), reg); iter != end; ++iter) { 
    cout << *iter << endl; 
} 

이 예제는 Wrox 책 Professional C++의 예제입니다.

1

이것이 정말로 C++ 인 경우 C 문자열이 아닌 std :: string을 사용해야합니다. 여기

는 분할만을 STL을 사용하는 예입니다 std::string std::vector로 :

#include <cstddef> 
#include <string> 
#include <vector> 

std::vector<std::string> split(std::string str, std::string sep) { 
    std::vector<std::string> vec; 

    size_t i = 0, j = 0; 
    do { 
     i = str.find(sep, j); 
     vec.push_back(str.substr(j, i-j)); 
     j = i + sep.size(); 
    } while (i != str.npos); 

    return vec; 
} 

int main() { 
    std::vector<std::string> vec = split("This[,]is[[,]your, string", "[,]"); 
    // vec is contains "This", "is[", "your, string" 

    return 0; 
} 
관련 문제