Gibt es eine eingebaute Funktion, die zwei Get-Strings zwischen zwei Trennzeichen-Strings in C/C++ enthält?
Meine Eingabe sieht aus wie
_STARTDELIMITER_0_192.168.1.18_STOPDELIMITER_
Und meine Ausgabe sollte sein
_0_192.168.1.18_
Danke im Voraus…
@PaulR: Was ist falsch an C++11 ?
– Mike Housky
14. September 2013 um 10:40 Uhr
Ja, ich habe es mit strtok() versucht, aber wenn etwas fertig ist, kann ich das verwenden …
– Haris
14. September 2013 um 10:42 Uhr
@Mike: Nun ja, aber nicht jeder verwendet C++11
– PaulR
14. September 2013 um 10:43 Uhr
Schub? C++ ? was sind das für kommentare Ein einfaches Problem braucht eine einfache Lösung: standardmäßiges abwärtskompatibles ANSI C++ und nichts anderes als die STL
– Didac Perez Parera
14. September 2013 um 10:58 Uhr
Saksham
Sie können Folgendes tun:
string str = "STARTDELIMITER_0_192.168.1.18_STOPDELIMITER";
unsigned first = str.find(STARTDELIMITER);
unsigned last = str.find(STOPDELIMITER);
string strNew = str.substr (first,last-first);
In Anbetracht Ihrer STOPDELIMITER Trennzeichen wird nur einmal am Ende vorkommen.
BEARBEITEN:
Da das Trennzeichen mehrfach vorkommen kann, ändern Sie Ihre Anweisung zum Auffinden von STOPDELIMITER in:
unsigned last = str.find_last_of(STOPDELIMITER);
Dadurch erhalten Sie Text zwischen dem ersten STARTDELIMITER und dem LAST STOPDELIMITER, obwohl sie mehrmals wiederholt werden.
H danke für die Antwort, aber ich bekomme das Ergebnis wie STARTDELIMITER_0_192.168.1.18_
– Haris
14. September 2013 um 10:51 Uhr
@Haris Ich glaube, du hast am Anfang einen Unterstrich.
– Saksham
14. September 2013 um 10:53 Uhr
@SakshamJa, das habe ich, und das Trennzeichen kann mehrmals vorkommen
– Haris
14. September 2013 um 10:56 Uhr
Aber das ist ein Zeichentrennzeichen. Es ist keine Saite zwischen zwei Saiten.
– hB0
30. Oktober 2013 um 23:03 Uhr
ifma
Ich habe keine Ahnung, wie die oberste Antwort so viele Stimmen erhalten hat, dass sie es getan hat, als die Frage eindeutig fragt, wie man eine Zeichenfolge zwischen zwei Trennzeichen erhält Saitenund kein Zeichenpaar.
Wenn Sie dies tun möchten, müssen Sie die Länge des Zeichenfolgenbegrenzers berücksichtigen, da es sich nicht nur um ein einzelnes Zeichen handelt.
Fall 1: Beide Trennzeichen sind eindeutig:
Gegeben eine Zeichenfolge _STARTDELIMITER_0_192.168.1.18_STOPDELIMITER_ die Sie extrahieren möchten _0_192.168.1.18_ von können Sie die oberste Antwort so ändern, um den gewünschten Effekt zu erzielen. Dies ist die einfachste Lösung, ohne zusätzliche Abhängigkeiten (z. B. Boost) einzuführen:
Es ist notwendig, die Position des ersten Trennzeichens im zweiten Argument hinzuzufügen std::string::substr wie last - (first + start_delim.length()) um sicherzustellen, dass der gewünschte innere String immer noch korrekt extrahiert wird, falls sich das Starttrennzeichen nicht ganz am Anfang des Strings befindet, wie im zweiten Fall oben gezeigt.
Fall 2: Eindeutiges erstes Trennzeichen, nicht eindeutiges zweites Trennzeichen:
Angenommen, Sie möchten eine Zeichenfolge zwischen einem eindeutigen Trennzeichen und dem ersten nicht eindeutigen Trennzeichen erhalten, das nach dem ersten Trennzeichen auftritt. Sie könnten die obige Funktion ändern get_str_between_two_str benutzen find_first_of stattdessen, um den gewünschten Effekt zu erzielen:
Wenn Sie stattdessen Zeichen zwischen dem ersten eindeutigen Trennzeichen und dem letzten gefundenen zweiten Trennzeichen erfassen möchten, wie es der Fragesteller oben kommentiert hat, verwenden Sie find_last_of stattdessen.
Fall 3: Nicht eindeutiges erstes Trennzeichen, eindeutiges zweites Trennzeichen:
Sehr ähnlich zu Fall 2, kehren Sie einfach die Logik zwischen dem ersten und dem zweiten Trennzeichen um.
Fall 4: Beide Trennzeichen sind nicht eindeutig:
Erstellen Sie wieder, sehr ähnlich wie in Fall 2, einen Container, um alle Zeichenfolgen zwischen einem der beiden Trennzeichen zu erfassen. Durchlaufen Sie die Zeichenfolge und aktualisieren Sie die Position des ersten Trennzeichens so, dass sie gleich der Position des zweiten Trennzeichens ist, wenn es angetroffen wird, und fügen Sie die Zeichenfolge dazwischen zum Container hinzu. Wiederhole bis std::string:npos ist erreicht.
Um eine Zeichenfolge zwischen 2 Trennzeichenfolgen ohne Leerzeichen zu erhalten.
string str = "STARTDELIMITER_0_192.168.1.18_STOPDELIMITER";
string startDEL = "STARTDELIMITER";
// this is really only needed for the first delimiter
string stopDEL = "STOPDELIMITER";
unsigned firstLim = str.find(startDEL);
unsigned lastLim = str.find(stopDEL);
string strNew = str.substr (firstLim,lastLim);
//This won't exclude the first delimiter because there is no whitespace
strNew = strNew.substr(firstLim + startDEL.size())
// this will start your substring after the delimiter
Ich habe versucht, die beiden Teilzeichenfolgenfunktionen zu kombinieren, aber es hat begonnen, das STOPDELIMITER zu drucken
@PaulR: Was ist falsch an C++11?
– Mike Housky
14. September 2013 um 10:40 Uhr
Ja, ich habe es mit strtok() versucht, aber wenn etwas fertig ist, kann ich das verwenden …
– Haris
14. September 2013 um 10:42 Uhr
@Mike: Nun ja, aber nicht jeder verwendet C++11
– PaulR
14. September 2013 um 10:43 Uhr
Schub? C++? was sind das für kommentare Ein einfaches Problem braucht eine einfache Lösung: standardmäßiges abwärtskompatibles ANSI C++ und nichts anderes als die STL
– Didac Perez Parera
14. September 2013 um 10:58 Uhr