2012-06-18 45 views
6

Creo que necesito una versión inversa de strtok, como:Cómo invertir de manera inversa una cadena de C++ de la cola a la cabeza?

char* p = rstrtok(str, delimeters); 

Por ejemplo, secuencialmente obtener la posición de '-', '_' y '+' en la cadena "hola + stack_over-flujo" usando una delimitador conjunto de "+ _-"

que sólo se preocupan por los delimitadores , y su posición , (no el contenido medio), por lo que supongo que el boost::split_iterator no es apropiado aquí.

¿Existe alguna función de utilidad que pueda aprovechar? o cualquier solución para hacer frente a este tipo de situación?
Además, dado que estoy haciendo C++, ¿hay algún enfoque conveniente para evitar esta vieja C?

(I buscado "strtok inversa" sino que simplemente reciben "apilar sobre el flujo" a "flujo sobre la pila" cosas ...)

+1

No creo que hay una función que hará esto por usted. Creo que deberías usar un bucle. – nhahtdh

Respuesta

3

Se puede hacer esto con strpbrk:

char string[] = "hello+stack_over-flow"; 

char *pos = string; 
while (*pos != '\0' && (pos = strpbrk(pos, "+-_")) != NULL) 
{ 
    /* Do something with `pos` */ 

    pos++; /* To skip over the found character */ 
} 
+0

gracias @jo, creo que me gusta strpbrk, pero ¿hay una versión inversa de esto? o voy a invertir la secuencia primero y usar esto.Hope pasará la revisión del código ... – Lyn

+0

@Lyn Hasta donde yo sé, no hay una versión inversa de él, así que, lamentablemente, primero tienes que invertir la cadena. –

8

Se podría rodar su propio uso de strrchr.

Si utiliza el estilo C++ std::string puede aprovechar string::find_last_of.

+0

gracias @dirk, string :: find_last_of es bueno, pero tengo que iterar la colección de delimetersies cada vez; y compara las distancias para ver quién es el más cercano a la cola. – Lyn

+0

@Lyn: esto no estaba especificado en su pregunta. ¿Puedes editar tu pregunta y publicar qué * exactamente * quieres como resultado (posiblemente con algunos ejemplos)? – dirkgently

+0

Creo que tengo que defenderme ... el ejemplo y la salida es "Por ejemplo, obtener secuencialmente la posición de '-', '_' y '+' en la cadena" hello + stack_over-flow "usando un conjunto delímetro de "+ _-" "; Además, supongo que todos queremos hacer las cosas de una manera pesada y propensa a errores. – Lyn

0

strtok es bastante simple en las versiones más básicas - un par de cientos de líneas como máximo. Si busca en google "strtok filetype: c", puede ver cómo se implementa en las distintas bibliotecas.

Una solución muy ingenua sería invertir la secuencia primero, y luego hacer el strtok(). Sin embargo, esto es malo para cadenas largas, pero si necesita rendimiento, vaya a rodar su propio strtok().

Algo como esto:

void reverse(char* dest, const char* src) 
{ 
    int len = strlen(src); 
    int i; 
    for(i = 0; i < len; ++i) 
     dest[len-i-1] = src[i]; 
} 

EDIT:

Casualmente tengo esta página Dr. Dobbs se abre en una pestaña de una búsqueda en Google de ayer: http://www.drdobbs.com/conversations-al-go-rithms/184403801

Cuestiones relacionadas