"Suchen" und "Ersetzen" Problem mit Backslash-Zeichen



  • Hallo zusammen!

    Ich habe ein Problem mit "Suchen" und "Ersetzen" innerhalb eines Strings.
    Das Programm funktioniert genau wie es soll, solange man nicht versucht Backslashes (\) zu suchen und mit irgendetwas zu ersetzen.

    Es erscheint keine Fehlermeldung, doch das Programm hängt sich beim Ausführen auf. Komme nur mit "strg+c" wieder raus.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    // HomeString = der 'Quell'-String in dem gesucht wird
    // SearchString = die Zeichen nach denen in HomeString gesucht werden soll
    // ReplaceWithString = die Zeichen, welche SearchString ersetzten sollen
    
    string ReplaceString(string HomeString, string SearchString, string ReplaceWithString)
    {
    		if (SearchString != ReplaceWithString)
    		{
    			string::size_type pos = 0;
    			while( (pos = HomeString.find(SearchString, pos)) != string::npos )
    			{
    				HomeString.replace( pos, SearchString.size(), ReplaceWithString);
    				pos++;
    			}
    		}
    		return HomeString;
    }
    
    int main()
    {	
    	string home = "C:\\ordner\\ordner2";
    	cout << home << endl;
    	home = ReplaceString(home, "\\", "\\\\"); // Backslash funktioniert nur mit zusätzlichem Zeichen: home = ReplaceString(home, "r\\", "\\\\") funktioniert...
        cout << home << endl;
        return 0;
    }
    

    Wäre fantastisch wenn jemand eine Lösung für das Problem hätte!?

    MfG
    robomarv

    (P.s.: die Funktion soll in einem komplexeren Programm öfters verwendet werden --> daher die Aufteilung in 'ReplaceString' und 'main')
    (P.p.s.: benutze VisualStudio 2008)



  • pos += ReplaceWithString.length(); statt pos++



  • Zeigt wieder mal die Klasse der Std.Lib, dass sich jeder sowas selber schreiben muss.



  • #include <string>
    #include <iostream>
    #include <boost/algorithm/string.hpp>
    
    int main()
    {
    	using namespace std;
        using namespace boost;
    
    	string home = "C:\\ordner\\ordner2";
        cout << home << endl;
    
    	home = replace_all_copy( home, "\\", "\\\\" );
        // Oder
        replace_all( home, "\\", "\\\\" );
    
        cout << home << endl;
        return 0; 
    }
    


  • warum willst du eigtl unbedingt mit \\ statt / arbeiten?

    C:/Programme/
    geht genau so, wie
    C:\\Programme\\

    Ich bevorzuge auch immer die obere Lösung - schon allein, weil man dann wieder ein wenig plattformunabhängiger ist (Windows akzeptiert '\' und '/', Linux '/') - und abgesehen davon ist es eben sehr viel übersichtlicher...

    bb



  • Klasse wie schnell es hier Hilfe gibt! 👍

    @rater
    Vielen vielen Dank! Das pos++ falsch sein könnte war mir gar nicht in den Sinn gekommen! Da hätte ich noch eine Weile rumsuchen können...

    @Badestrand
    Interessant! Danke für dein Beispiel! Mit der Boost-Bibliothek hatte ich mich bisher noch nicht beschäftigt.

    @unskilled
    Stimmt '/' wäre hier besser, nur hier ging es mir hauptsächlich um den seltsamen Fehler im Code.
    Diese string.replace Funktion ist auch vorerst mal nur für Windows gedacht^^

    MfG
    robomarv


Anmelden zum Antworten