Frage

Hier ist mein Code für eine Sequenz in einem String zu finden und es mit einem anderen zu ersetzen:

std::string find_and_replace( string &source, string find, string replace )
{
    size_t j;
    for ( ; (j = source.find( find )) != string::npos ; )
    {
        source.replace( j, find.length(), replace );
    }
    return source;
}

Alles funktioniert gut, wenn ich etwas nennen wie:

find_and_replace(test, "foo", "bar")

Meine Anwendung erfordert mir ein Apostroph mit zwei einfachen Anführungszeichen zu ersetzen, kein doppeltes Anführungszeichen. Zum Beispiel würde ich nennen:

find_and_replace(test, "'", "''")

Aber wenn ich dies nennen, friert die Funktion aus irgendeinem Grund auf. Wer weiß, was könnte die Ursache für dieses Problem sein?

Edit: auf der Grundlage der Antworten, die ich bekommen habe, habe ich den Code festgelegt:

std::string find_and_replace( string &source, string find, string replace )
{
    string::size_type pos = 0;
    while ( (pos = source.find(find, pos)) != string::npos ) {
        source.replace( pos, find.size(), replace );
        pos += replace.size();
    }
    return source;
}

Ich hoffe, das hilft einige Leute das gleiche Problem.

War es hilfreich?

Lösung

Sie haben eine Endlosschleife bekommen, weil Ihr Zustand nicht nach vorne bewegen. Du bist immer j = source.find( find ) läuft, aber Sie ersetzen ' mit '', so dass Sie immer die erste Apostroph auf die Zeichenfolge jedes Mal, und das Hinzufügen eines neuen Apostroph zu finden.

Sie müssen sicherstellen, dass Sie nicht die gleiche Apostroph übereinstimmen zweimal durch Bewegen wo Sie scannen vorwärts jedes Mal, wenn Sie etwas ersetzen.

Die find Funktion nimmt einen zweiten Parameter, der die Startposition in der Zeichenfolge für die Teilkette zu suchen ist. Sobald Sie die Position des ersten Spiels gefunden haben, die Startposition bewegt bis zu dieser Position plus der Länge der Saite sind Sie es mit zu ersetzen.

Andere Tipps

Weil Sie ersetzen ‚mit‚‘, dann‘ wieder suchen, zu finden, die erste von denen, die Sie gerade dort gesetzt haben. Was Sie ersetzen. Und so weiter.

Sie versuchen die gleiche Zeichenfolge zu ersetzen, die Sie hinzugefügt.

Es ist wahrscheinlich besser von Recht auf Arbeit nach links. Dies funktioniert für mich:

const std::string& replacestring( std::string& strString, const std::string& strOld, const std::string& strNew )
{
    for ( int nReplace = strString.rfind( strOld ); nReplace != std::string::npos; nReplace = strString.rfind( strOld, nReplace - 1 ) )
    {
        strString.replace( nReplace, strOld.length(), strNew );
        if ( nReplace == 0 )
            break;
    }
    return strString;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top