Pregunta

Hola i estado tratando de conseguir un señalizador para trabajar con la clase impulso biblioteca tokenizer. He encontrado este tutorial sobre la documentación impulso:

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

problema es no puedo conseguir el argumento de que escapó _separator _list ( "", "", "");

pero si modifico el realce / tokenizer.hpp depositarlas en la obra de. pero eso no es solución ideal y se preguntaba si hay algo falto de obtener diferentes argumentos en el _separator _list escapado.

quiero que sea dividido en espacios con "y" para escapar y sin carácter de escape dentro de la cadena entre comillas.

esto se utiliza para un sistema de análisis de argumentos en un sistema de la consola dentro del juego.


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 tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)> tok(s); for(tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)>::iterator beg=tok.begin(); beg!=tok.end();++beg) { cout << *beg << "\n"; } }

el error de Visual Studio 2005 es C2974 de error: 'boost :: tokenizer': argumento no válido para la plantilla 'TokenizerFunc', tipo esperado

EDIT: Esta pregunta se awnsered por Ferruccio y explicada por todo el mundo de Peter de agradecimiento.

¿Fue útil?

Solución

intente lo siguiente:

#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";
    }
}

Otros consejos

Parece como si estuviera declarando su tipo tokenizer incorrectamente.

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"; }

¿Quieres hacer un objeto escrito boost::tokenizer< boost::escaped_list_separator< char > > con un objeto separador boost::escaped_list_separator< char > como su TokenizerFunc.

Un punto relevante aún no la respuesta para esto es que si el usuario quiere dar salida a una doble cita en el resultado, la cita incorporado ( "") se describe en la Wikipedia ( como aquí ) debe sustituirse por una cadena de (\\\"), donde \\ significa un char de escape y \": la marca de cotización. De esta manera, la marca de cotización se mostrará en el resultado de la salida. El siguiente fragmento de código es un ejemplo.

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';

Esta es una salida típica de este

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top