¿Cómo anular de forma inversa una cadena de C ++ de la cola a la cabeza?

Creo que necesito una versión inversa de strtok, como:

char* p = rstrtok(str, delimeters);

Por ejemplo, obtenga secuencialmente la posición de '-' , '_' y '+' en la cadena "hello + stack_over-flow" usando un conjunto delimeter de "+ _-"

Solo me importan los delimeters y su posición , (no el contenido entre), así que supongo que el boost :: split_iterator no es apropiado aquí.

¿Hay alguna función de utilidad existente 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 método conveniente para evitar esta vieja C?

(Busqué "strtok inverso" pero simplemente obtuve "stack over flow" para "flow over stack" ...)

6
No creo que haya una función que haga esto por ti. Creo que deberías usar un bucle.
agregado el autor nhahtdh, fuente

3 Respuestas

Puede hacer su propio uso de strrchr .

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

8
agregado
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.
agregado el autor Lyn, fuente
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 delímetro conjunto de "+ -" "; Además, supongo que todos queremos hacer las cosas de una manera pesada y propensa a errores.
agregado el autor Lyn, fuente
@Lyn: Esto no fue especificado en tu pregunta. ¿Puede editar su pregunta y publicar qué exactamente le gustaría obtener como resultado (posiblemente con algunos ejemplos)?
agregado el autor dirkgently, fuente
@Lyn: la parte que * tienes que comparar las distancias ... * no estaba allí. Esto no se trata de defender. Se trata de optimizar tu tiempo y el de las personas que intentan ayudarte. FWIW, esta pregunta bien podría haber sido cerrada ya que no nos dices qué has intentado.
agregado el autor dirkgently, fuente

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 */
}
3
agregado
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 ...
agregado el autor Lyn, fuente
@Lyn Hasta donde yo sé, no hay una versión inversa, por lo que desafortunadamente tienes que invertir la cadena primero.
agregado el autor Some programmer dude, fuente

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 cadena primero, y luego hacer 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];
}

EDITAR:

Coincidentally I have this Dr Dobbs page open in a tab from a Google search yesterday: http://www.drdobbs.com/conversations-al-go-rithms/184403801

0
agregado