Was ist der effektive Weg, um alle Vorkommen eines Charakters durch einen anderen Charakter in zu ersetzen std::string
?
c++
algorithm
str-replace
stdstring
big-z
quelle
quelle
std::string
ist ein Container, der speziell für die Arbeit mit Zeichenfolgen entwickelt wurde. Linkstd::string::replace()
stattstd::replace()
! 'x' (char
) wird implizit insize_t
[Wert 120] umgewandelt, sodass die gesamte Zeichenfolge oder ein Teil davon mit 120 Kopien von 'y' gefüllt wird.Ich dachte, ich würde auch die Boost-Lösung einwerfen:
quelle
-I
Flags für Ihren Compiler, damit er die Boost-Bibliotheken auf Ihrem System findet. Vielleicht müssen Sie es zuerst installieren.Die Frage konzentriert sich auf das
character
Ersetzen, aber da ich diese Seite sehr nützlich fand (insbesondere Konrads Bemerkung), möchte ich diese allgemeinere Implementierung teilen, die auch Folgendes ermöglichtsubstrings
:Verwendungszweck:
Ausgänge:
BEARBEITEN:
Das Obige kann in geeigneterer Weise implementiert werden, falls die Leistung von Belang ist, indem nichts zurückgegeben wird (
void
) und die Änderungen direkt an derstr
als Argument angegebenen Zeichenfolge ausgeführt werden, die als Adresse statt als Wert übergeben wird . Dies würde eine nutzlose und kostspielige Kopie der Originalzeichenfolge vermeiden und gleichzeitig das Ergebnis zurückgeben. Ihr Anruf dann ...Code:
Hoffe, dass dies für einige andere hilfreich sein wird ...
quelle
from
Zeichenfolge leer ist, da sonst eine Endlosschleife auftritt.Stellen Sie sich einen großen binären Blob vor, bei dem alle 0x00 Bytes durch "\ 1 \ x30" und alle 0x01 Bytes durch "\ 1 \ x31" ersetzt werden sollen, da das Transportprotokoll keine \ 0 Bytes zulässt.
In Fällen, in denen:
Die bereitgestellten Lösungen können nicht angewendet werden (da sie nur einzelne Zeichen ersetzen) oder haben ein Leistungsproblem, da sie string :: replace mehrmals aufrufen würden, wodurch immer wieder Kopien der Größe des Blobs generiert werden. (Ich kenne die Boost-Lösung nicht, vielleicht ist es aus dieser Perspektive in Ordnung)
Dieser geht alle Vorkommen in der Quellzeichenfolge entlang und erstellt die neue Zeichenfolge Stück für Stück einmal :
quelle
Ein einfaches Suchen und Ersetzen eines einzelnen Zeichens würde ungefähr so aussehen:
s.replace(s.find("x"), 1, "y")
Um dies für die gesamte Zeichenfolge zu tun, ist es einfach, eine Schleife zu erstellen, bis Sie
s.find
zurückkehrennpos
. Ich nehme an, Sie könnten auch fangenrange_error
, um die Schleife zu verlassen, aber das ist irgendwie hässlich.quelle
{
Charakter. Ich weiß nicht, was eine "Doppelklammer" ist. Vielleicht haben Sie ein Schriftproblem?Wenn Sie mehr als ein einzelnes Zeichen
std::string
ersetzen möchten und nur damit arbeiten, funktioniert dieses Snippet und ersetzt sNeedle in sHaystack durch sReplace, und sNeedle und sReplace müssen nicht dieselbe Größe haben. Diese Routine verwendet die while-Schleife, um alle Vorkommen zu ersetzen, und nicht nur die erste, die von links nach rechts gefunden wurde.quelle
find
zweimal einen Anruf. Erwägen Sie, dieses Ergebnis zu einer temporären Variablen zu machen.Verwenden Sie, wie Kirill vorgeschlagen hat, entweder die Ersetzungsmethode oder iterieren Sie entlang der Zeichenfolge, um jedes Zeichen unabhängig voneinander zu ersetzen.
Alternativ können Sie die
find
Methode verwenden oderfind_first_of
je nachdem, was Sie tun müssen. Keine dieser Lösungen erledigt die Aufgabe auf einmal, aber mit ein paar zusätzlichen Codezeilen sollten Sie sie für Sie arbeiten lassen. :-)quelle
quelle
word
es lang ist, kann es beim Aufrufen der Funktion zu einem hohen Overhead kommen. Sie können diese optimieren , indem manword
,target
undreplacement
als const Verweise.Was ist mit Abseil StrReplaceAll ? Aus der Header-Datei:
quelle
Alte Schule :-)
Ergebnis:
quelle
Das funktioniert! Ich habe etwas Ähnliches für eine Buchhandlungs-App verwendet, in der das Inventar in einer CSV (wie einer .dat-Datei) gespeichert wurde. Im Fall eines einzelnen Zeichens, dh der Ersetzer ist nur ein einzelnes Zeichen, z. B. '|', muss es in doppelten Anführungszeichen "|" stehen. um keine ungültige Konvertierung zu werfen const char.
Normalerweise verwende ich derzeit CentOS, daher ist meine Compilerversion unten aufgeführt. Die C ++ - Version (g ++), C ++ 98 Standard:
quelle
Wenn Sie bereit sind,
std::string
s zu verwenden , können Sie diestrsub
Funktion dieser Beispiel-App unverändert verwenden oder aktualisieren, wenn Sie möchten, dass ein anderer Typ oder ein anderer Parametersatz verwendet wird, um ungefähr dasselbe Ziel zu erreichen. Grundsätzlich werden die Eigenschaften und Funktionen von verwendetstd::string
, um den übereinstimmenden Zeichensatz schnell zu löschen und die gewünschten Zeichen direkt in das Zeichen einzufügenstd::string
. Jedes Mal, wenn dieser Ersetzungsvorgang ausgeführt wird, wird der Offset aktualisiert, wenn immer noch passende Zeichen zum Ersetzen gefunden werden können. Wenn er nicht ersetzt werden kann, gibt er die Zeichenfolge in ihrem Zustand vom letzten Update zurück.Wenn Sie sich nicht auf die Verwendung von
std::string
s als Parameter verlassen möchten, um stattdessen Zeichenfolgen im C-Stil zu übergeben, sehen Sie das aktualisierte Beispiel unten:quelle
In einfachen Situationen funktioniert dies ziemlich gut, ohne eine andere Bibliothek als std :: string (die bereits verwendet wird) zu verwenden.
Ersetzen Sie alle Vorkommen von Zeichen a durch Zeichen b in some_string :
Wenn die Zeichenfolge groß ist oder mehrere zu ersetzende Aufrufe ein Problem darstellen, können Sie die in dieser Antwort erwähnte Technik anwenden: https://stackoverflow.com/a/29752943/3622300
quelle
Hier ist eine Lösung, die ich in einem maximalen DRI-Geist entwickelt habe. es sucht sNeedle in sHaystack und ersetzt es durch sReplace, nTimes wenn nicht 0, sonst alle sNeedle-Vorkommen. Der ersetzte Text wird nicht erneut gesucht.
quelle