Como reversamente strtok uma seqüência de C ++ do rabo à cabeça?

Eu acho que preciso de uma versão reverse do strtok, como:

char* p = rstrtok(str, delimeters);

Por exemplo, obtenha sequencialmente a posição de '-' , '_' e '+' na string "hello + stack_over-flow" usando um conjunto delimitador de "+ _-"

Eu só me preocupo com os delimeters , e sua posição , (não o conteúdo entre), então eu acho que o boost :: split_iterator não é apropriado Aqui.

Existe alguma função de utilidade existente que eu possa aproveitar? ou alguma solução para lidar com esse tipo de situação?
Além disso, desde que eu estou fazendo C ++, existe alguma abordagem conveniente para evitar essa moda antiga C?

(Eu procurei "strtok reverso", mas apenas "pilha sobre o fluxo" para "fluir sobre pilha" coisas ...)

6
adicionado editado
Visualizações: 1
Eu não acho que haja uma função que faça isso por você. Eu acho que você deveria usar um loop.
adicionado o autor nhahtdh, fonte

3 Respostas

Você pode fazer o seu próprio usando strrchr .

Se você usar o estilo C ++ std :: string , poderá usar string :: find_last_of .

8
adicionado
obrigado @dirk, string :: find_last_of é bom, mas eu tenho que iterar a coleção de delímetros toda vez; e compare as distâncias para ver quem é o mais próximo da cauda.
adicionado o autor Lyn, fonte
Eu acho que tenho que me defender ... o exemplo e a saída é "Por exemplo, sequencialmente obtenha a posição de '-', '' e '+' na string" hello + stack_over-flow "usando um delimitador conjunto de "+ -" "; Além disso, acho que todos nós queremos fazer as coisas de uma maneira opressiva e propensa a erros.
adicionado o autor Lyn, fonte
@Lyn: Isso não foi especificado na sua pergunta. Você pode editar sua pergunta e postar o que exatamente você gostaria como saída (possivelmente com alguns exemplos)?
adicionado o autor dirkgently, fonte
@Lyn: A parte que * você tem que comparar as distâncias ... * não estava lá. Isto não é sobre defender. Trata-se de otimizar seu tempo e o de pessoas que estão tentando ajudá-lo. FWIW, esta questão pode ter sido encerrada, já que você não nos diz o que tentou.
adicionado o autor dirkgently, fonte

Você poderia fazer isso com 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
adicionado
obrigado @jo, eu acho que eu gosto de strpbrk, mas existe uma versão reversa dele? ou eu vou inverter a string primeiro e usar isso. Esperança vai passar a revisão do código ...
adicionado o autor Lyn, fonte
@Lyn Até onde eu sei, não há versão reversa, então infelizmente você tem que inverter a string primeiro.
adicionado o autor Some programmer dude, fonte

strtok é bem simples nas versões mais básicas - algumas centenas de linhas no máximo. Se você pesquisar no Google "strtok filetype: c", poderá ver como ele é implementado nas várias bibliotecas.

Uma solução muito ingênua seria reverter primeiro a string e depois fazer o strtok (). No entanto, isso é ruim para cadeias longas, mas se você precisar de desempenho, execute seu próprio strtok ().

Algo assim:

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
adicionado