2009-07-06 16 views
1

Hier ist mein Code für eine Sequenz in einem String zu finden und durch ein anderes ersetzt:Einzel Zitat Probleme mit C++ Suchen und Ersetzen-Funktion

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, dass ich ein einzelnes Anführungszeichen durch zwei einfache Anführungszeichen, kein Anführungszeichen ersetzen. Zum Beispiel würde ich anrufen:

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

Aber immer wenn ich dies anrufe, friert die Funktion aus irgendeinem Grund ein. Weiß jemand, was die Ursache für dieses Problem sein könnte?

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.

+0

Umm, irgendeinen Grund für den Downvote? Downvotes ohne Begründung sind nutzlos, weil sie dem Ersteller nicht sagen, wie sie ihre Fragen verbessern können. –

Antwort

9

Sie haben eine Endlosschleife, weil sich Ihr Zustand nicht vorwärts bewegt. Sie laufen immer j = source.find(find), aber Sie ersetzen ' durch '', so dass Sie immer das erste Apostroph jedes Mal finden und ein neues Apostroph der Zeichenfolge hinzufügen.

Sie müssen sicherstellen, dass Sie nicht zweimal den gleichen Apostroph erhalten, indem Sie sich bei jedem neuen Austausch nach vorne bewegen.

Die Funktion find nimmt einen zweiten Parameter, der die Startposition in der Zeichenfolge ist, um nach der Teilzeichenfolge zu suchen. Sobald Sie die Position des ersten Matches gefunden haben, verschieben Sie die Startposition bis zu dieser Position plus die Länge des Strings, mit dem Sie es ersetzen.

4

Weil Sie 'mit' ersetzen, suchen Sie nach 'wieder, finden Sie die erste von denen, die Sie gerade dort gesetzt haben. Welche ersetzen Sie? Und so weiter.

1

Sie versuchen, dieselbe Zeichenfolge zu ersetzen, die Sie hinzugefügt haben.

1

Es ist wahrscheinlich besser, von rechts nach links zu arbeiten. Das funktioniert bei mir:

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; 
} 
+0

Von rechts nach links macht keinen Unterschied, außer versehentlich. –