Wie man rückwärts eine C ++ - Zeichenkette von Schwanz zu Kopf strkt?

Ich denke, ich brauche eine umgekehrte Version von strtok, wie:

char* p = rstrtok(str, delimeters);

B. nacheinander die Position von '- , ' _ ' und ' + ' in der Zeichenfolge "hallo + stack_over-flow" mit einem Delimetersatz von "+ _-"

Ich interessiere mich nur für die Delimater und ihre Position (nicht für den Inhalt dazwischen), daher ist der boost :: split_iterator nicht geeignet Hier.

Gibt es eine vorhandene Dienstprogrammfunktion, die ich nutzen kann? oder irgendeine Lösung, um mit dieser Art von Situation umzugehen? Außerdem, da ich C ++ mache, gibt es irgendeinen bequemen Ansatz, um diese alte Mode C zu vermeiden?

(Ich habe "reverse strtok" gesucht, aber bekomme einfach "stack over flow" zu "flow over stack" stuff ...)

6
hinzugefügt bearbeitet
Ansichten: 1
Ich glaube nicht, dass es eine Funktion gibt, die das für Sie tun wird. Ich denke du solltest eine Schleife benutzen.
hinzugefügt der Autor nhahtdh, Quelle

3 Antworten

Sie können Ihre eigenen Rollen mit strrchr erstellen.

Wenn Sie den C ++ - Stil std :: string verwenden, können Sie string :: find_last_of .

8
hinzugefügt
Danke @dirk, string :: find_last_of ist gut, aber ich muss jedes Mal die Sammlung von Delimetern durchlaufen; und vergleiche die Entfernungen, um zu sehen, wer dem Schwanz am nächsten ist.
hinzugefügt der Autor Lyn, Quelle
Ich denke, ich muss mich verteidigen ... Das Beispiel und die Ausgabe lautet "Beziehe zum Beispiel nacheinander die Position von '-', '' und '' in die Zeichenkette" Hallo + Stapel_Überlauf "mit einem Delimeter Satz von "+ -" "; Außerdem denke ich, dass wir alle Dinge in einer lästigen und fehleranfälligen Art tun wollen.
hinzugefügt der Autor Lyn, Quelle
@Lyn: Dies wurde in Ihrer Frage nicht angegeben. Kannst du deine Frage editieren und veröffentlichen, was genau du möchtest (vielleicht mit einigen Beispielen)?
hinzugefügt der Autor dirkgently, Quelle
@Lyn: Der Teil, dass * du die Entfernungen vergleichen musst ... * war nicht da. Hier geht es nicht um Verteidigung. Es geht darum, Ihre Zeit und die der Menschen, die Ihnen helfen wollen, zu optimieren. FWIW, diese Frage ist möglicherweise geschlossen, weil Sie uns nicht sagen, was Sie versucht haben.
hinzugefügt der Autor dirkgently, Quelle

Sie können dies mit strpbrk tun:

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
hinzugefügt
danke @jo, ich denke ich mag strpbrk, aber gibt es eine umgekehrte Version davon? oder ich werde die Saite zuerst umkehren und diese benutzen. Die Hoffnung wird den Code Review bestehen ...
hinzugefügt der Autor Lyn, Quelle
@Lyn Soweit ich weiß, gibt es keine umgekehrte Version, also müssen Sie die Zeichenfolge leider zuerst umkehren.
hinzugefügt der Autor Some programmer dude, Quelle

Strtok ist in den einfachsten Versionen ziemlich einfach - höchstens ein paar hundert Zeilen. Wenn Sie "strtok filetype: c" googlen, können Sie sehen, wie es in den verschiedenen Bibliotheken implementiert ist.

Eine sehr naive Lösung wäre, die Saite zuerst umzukehren und dann die strtok() zu machen. Dies ist jedoch für lange Strings schlecht, aber wenn Sie Leistung benötigen, rollen Sie Ihre eigene strtok ().

Etwas wie das:

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];
}

BEARBEITEN:

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
hinzugefügt