문제

안녕하세요 저는 부스트 라이브러리 토크나이저 클래스를 사용하여 토크나이저가 작동하도록 하려고 노력해 왔습니다.부스트 문서에서 이 튜토리얼을 찾았습니다.

http://www.boost.org/doc/libs/1 _36 _0/libs/tokenizer/escaped _list _separator.htm

문제는 인수를 이스케이프된 _list _separator("","","");로 가져올 수 없다는 것입니다.

하지만 Boost/tokenizer.hpp 파일을 수정하면 작동합니다.하지만 그것은 그렇지 않으며 이상적인 해결책은 이스케이프된 _list _separator에 다른 인수를 가져오기 위해 누락된 것이 있는지 궁금해하는 것입니다.

이스케이프를 위해 "및 '를 사용하고 인용 문자열 안에 이스케이프 문자가 없는 공백으로 분할하고 싶습니다.

이는 게임 내 콘솔 시스템의 인수 구문 분석 시스템에 사용됩니다.


include <iostream>
include <boost/tokenizer.hpp>
include <string>

int main () {네임 스페이스 std 사용;네임스페이스 부스트 사용;string s = "exec script1 \"스크립트 인수 번호 1\"";String Separator1 ( ""); // 인용 된 인수가 탈출되지 않도록 string speplator2 ( ""); // 공간에서 분할 string sparlator3 ( "" ' "); // 인용 Tokenizer를 인용했습니다. u003Cescaped_list_separatoru003Cchar> (Separator1, Separator2, Separator3)> 토크 (S);for(tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)>::iterator beg=tok.begin();beg! = tok.end (); ++ beg) {cout << *beg << " n";} }

Visual Studio 2005의 오류는 다음과 같습니다. 오류 C2974:'부스트::토크나이저':'TokenizerFunc'에 대한 템플릿 인수가 잘못되었습니다. 예상되는 유형입니다.

편집하다:이 질문은 ferrucio가 제기했으며 peter thanks의 모든 사람이 설명했습니다.

도움이 되었습니까?

해결책

이 시도:

#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>

int main()
{
    using namespace std;
    using namespace boost;
    string s = "exec script1 \"script argument number one\"";
    string separator1("");//dont let quoted arguments escape themselves
    string separator2(" ");//split on spaces
    string separator3("\"\'");//let it have quoted arguments

    escaped_list_separator<char> els(separator1,separator2,separator3);
    tokenizer<escaped_list_separator<char>> tok(s, els);

    for(tokenizer<escaped_list_separator<char>>::iterator beg=tok.begin(); beg!=tok.end();++beg)
    {
        cout << *beg << "\n";
    }
}

다른 팁

토큰 화기 유형을 잘못 선언하는 것 같습니다.

typedef boost::tokenizer< boost::escaped_list_separator<char> > Tokenizer;
boost::escaped_list_separator<char> Separator( '\\', ' ', '\"' );
Tokenizer tok( s, Separator );

for( Tokenizer::iterator iter = tok.begin(); iter != tok.end(); ++iter )
{ cout << *iter << "\n"; }

당신은 만들고 싶습니다 boost::tokenizer< boost::escaped_list_separator< char > > a boost::escaped_list_separator< char > 분리기 객체는 TokenizerFunc입니다.

이에 대한 답변이 아닌 관련 사항은 사용자가 결과에 큰따옴표를 출력하려는 ​​경우 Wikipedia(여기처럼)는 다음 문자열로 대체되어야 합니다. (\\\"), 어디 \\ 이스케이프 문자를 의미하고 \" 따옴표를 의미합니다.이런 방식으로 출력 결과에 따옴표가 표시됩니다.다음 코드 조각은 예시입니다.

typedef boost::escaped_list_separator<char> std_token;
typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;

std_token a_token( "\\", ",", "\"" );
std::string s = "\"Boost,\\\" C++ Libraries\" ";
tokenizer tok{ s, a_token };
for ( const auto &t : tok )
    std::cout << t << '\n';

이는 이에 대한 일반적인 출력입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top