podría mirar en std::stringstream
de <sstream>
. C-style strtok
tiene una serie de problemas de usabilidad, y las cadenas tipo C son problemáticas.
Aquí está un ejemplo ultra-trivial de ella tokenizar una oración en palabras:
#include <sstream>
#include <iostream>
#include <string>
int main(void)
{
std::stringstream sentence("This is a sentence with a bunch of words");
while (sentence)
{
std::string word;
sentence >> word;
std::cout << "Got token: " << word << std::endl;
}
}
[email protected]:/tmp$ g++ tokenize.cc && ./a.out
Got token: This
Got token: is
Got token: a
Got token: sentence
Got token: with
Got token: a
Got token: bunch
Got token: of
Got token: words
Got token:
La clase std::stringstream
es "bi-direccional", en que se apoya la entrada y la salida. Probablemente quieras hacer solo una o la otra, entonces usarías std::istringstream
o std::ostringstream
.
La belleza de ellas es que también son std::istream
y std::ostream
s, respectivamente, para que pueda utilizarlos como que tendría que utilizar std::cin
o std::cout
, que son de esperar familiar.
Algunos podrían argumentar que estas clases son caras de usar; std::strstream
desde <strstream>
es más o menos lo mismo, pero está construido sobre cadenas más baratas con terminación en C estilo 0. Puede ser más rápido para ti. Pero de todos modos, no me preocuparía el rendimiento de inmediato. Consigue algo que funcione y luego haz una evaluación comparativa. Lo más probable es que pueda obtener suficiente velocidad simplemente escribiendo C++ bien escrito que minimice la creación y destrucción de objetos innecesarios. Si todavía no es lo suficientemente rápido, entonces puedes buscar en otro lado. Sin embargo, estas clases son probablemente lo suficientemente rápidas. Su CPU puede perder miles de ciclos en la cantidad de tiempo que lleva leer un bloque de datos de un disco duro o red.
strtok es ** ** no un señalizador. Aún debe averiguar la diferencia entre una 'clase' o' const' o un identificador que se denomina algo así como 'calculate'. –
Un tokenizer * identifica * los tokens y las palabras posteriores un * lexical anlizer * los categoriza en tokens (es decir, la frase "joe come" -> tokenizer -> {joe, come} -> léxico analizador -> {(joe, sustantivo), (come, verbo)}). Tokenización es el proceso de * demarcación * y ** posiblemente ** clasificación de secciones de una cadena de caracteres de entrada. En el sentido clasificador, ni el tokenizador de impulso hace la clasificación. – clyfe
http://stackoverflow.com/questions/380455/looking-for-a-clear-definition-of-what-a-tokenizer-parser-and-lexers-are-a – clyfe