2011-06-16 13 views
17

He leído http://www.codeproject.com/KB/recipes/Tokenizer.aspx y quiero tener el último ejemplo (al final, justo antes de todos los gráficos) "Extender predicados delimitador" en mi principal, pero no obtengo los mismos tokens de salida que el autor del artículo hace cuando asigno token_list a un vector, ¿por qué?¿Cómo tener una "división personalizada()" en una lista con strtk?

¿Cómo poner el resultado real en una lista o un vector? Quiero tener esto:

  • abc List0
  • lista1 123, mno xyz
  • lista2 i \, jk

Pero tengo algo como:

  • List0 abc ; "123, mno xyz", i \, jk
  • list1 123, mno xyz ", i \, jk
  • lista2 i \, jk

muestra Fuente:

class extended_predicate 
{ 
public: 

    extended_predicate(const std::string& delimiters) 
    : escape_(false), 
    in_bracket_range_(false), 
    mdp_(delimiters) 
    {} 

    inline bool operator()(const unsigned char c) const 
    { 
     if (escape_) 
     { 
     escape_ = false; 
     return false; 
     } 
     else if ('\\' == c) 
     { 
     escape_ = true; 
     return false; 
     } 
     else if ('"' == c) 
     { 
     in_bracket_range_ = !in_bracket_range_; 
     return true; 
     } 
     else if (in_bracket_range_) 
     return false; 
     else 
     return mdp_(c); 
    } 

    inline void reset() 
    { 
     escape_ = false; 
     in_bracket_range_ = false; 
    } 

private: 

    mutable bool escape_; 
    mutable bool in_bracket_range_; 
    mutable strtk::multiple_char_delimiter_predicate mdp_; 
}; 

int main() 
{ 
    std::string str = "abc;\"123, mno xyz\",i\\,jk"; 
    strtk::std_string::token_list_type token_list; 
    strtk::split(extended_predicate(".,; "), 
       str, 
       std::back_inserter(token_list), 
       strtk::split_options::compress_delimiters); 

    return 0; 
} 

Respuesta

17

pude mismos resultados en CodeProject. ¿Qué versión de gcc usas? La versión de mi gcc es la siguiente.

g++ (GCC) 4.5.2 
Copyright (C) 2010 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

ACTUALIZACIÓN: Mi código es probado aquí: https://gist.github.com/1037493

+0

utilizo VisualStudio 2010 Ultimate. – Nazka

+17

He intentado con vc10. '" cl -Dstrtk_no_tr1_or_boost -DWIN32 -I "C: \ Program Files \ Boost_1_46_0" -I. test.cxx "'. Pero obtuve los mismos resultados. (Funciona bien) – mattn

+0

Cuando pongo token_list en un vector, por ejemplo, no tengo el buen resultado. Y cuando veo los valores de token_list en el modo set set, tengo los valores que escribí y no los 3 valores correctos. ¿Cómo puedo poner los valores reales en un vector, por ejemplo? – Nazka

Cuestiones relacionadas