backslash in String durch 2 Backslashes ersetzen



  • Hallo
    ich möchte in einem String ein Backslash durch 2 Backslashes ersetzen. Dafür benutze ich zur Zeit diesen Code:

    int pos1 = 0;
    do
    {
    	pos1 = folder.find(ersetzen3,pos);
    	if (pos1 != 0)
    	folder.replace(pos1,1,ersetzen2);
    }
    while (pos1 != 0);
    

    Das Problem ist jedoch das wenn er den ersten Backslash ersetze hat wiederrum den erseten Backslash von den ersetzten findet.
    Also C:\Programme\Rechner wird C:\\Programme\Rechner --> C:\\\Programme\Rechner -->C:\\\Programme\Rechner usw und nicht C:\\Programme\\Rechner
    Wie kann ich dies realisieren?
    Am Besten wäre ein Code beispiel.



  • Zwei Tricks:
    - den String von hinten durchgehen und ersetzen
    oder
    - alles in einen neuen String kopieren



  • Crysis_02 schrieb:

    ich möchte in einem String ein Backslash durch 2 Backslashes ersetzen.

    Das ist mit sehr hoher Wahrscheinlichkeit Unsinn.

    Wofür glaubst du das zu brauchen?



  • adfbhamrg schrieb:

    Zwei Tricks:
    - den String von hinten durchgehen und ersetzen
    oder
    - alles in einen neuen String kopieren

    wenn ich es von hinten durch gehe, dann wird es doch so:
    C:\Programme\Rechner --> C:\Programme\\Rechner --> C:\Programme\\\Rechner --> C:\Programme\\\Rechner --> C:\Programme\\\\Rechner
    oder etwa nicht?

    Wie meinst du das mit in einen neuen String kopieren?



  • Überpsring doch einfach den neuen Backslash.

    #include <iostream>
    
    int main()
    {
        std::string pfad = "C:\\Programme\\Blabla\\";
        for(unsigned i = 0; i < pfad.size(); ++i)
            if(pfad[i] == '\\') pfad.insert(i++, "\\");
        std::cout << pfad;
    }
    

    Aber wofür braucht man sowas?



  • Incocnito schrieb:

    Überpsring doch einfach den neuen Backslash.

    #include <iostream>
    
    int main()
    {
        std::string pfad = "C:\\Programme\\Blabla\\";
        for(unsigned i = 0; i < pfad.size(); ++i)
            if(pfad[i] == '\\') pfad.insert(i++, "\\");
        std::cout << pfad;
    }
    

    Aber wofür braucht man sowas?

    Super. Vielen Dank aht funktioniert. Ich brauche das als pfad für nen filestream.



  • BTW: Wenn du Boost nutzt kannst du http://www.boost.org/doc/libs/1_46_1/doc/html/boost/algorithm/replace_all.html einsetzen

    MfG SideWinder



  • Crysis_02 schrieb:

    wenn ich es von hinten durch gehe, dann wird es doch so:
    C:\Programme\Rechner --> C:\Programme\\Rechner --> C:\Programme\\\Rechner --> C:\Programme\\\Rechner --> C:\Programme\\\\Rechner
    oder etwa nicht?

    Nein

    C:\Programme\Rechner --> C:\Programme\\Rechner
                ^                        ^
                |                        |
    

    Die Pfeile zeigen auf den gleichen Index. Wenn du nach dem ersetzen regulär ein Zeichen nach vorne gehst, ist alles in Ordnung.



  • Auf welchem Betriebssystem bist du denn? Also bei Windows geht als Pfadangabe C:/irgendwas und C:[beliebig mehr backslashe]irgendwas, wobei in C++ erstere aufgrund der leichteren Verwendung von / einfacher ist. Ich check immer noch nicht wieso du das jetzt brauchst.



  • Incocnito schrieb:

    Auf welchem Betriebssystem bist du denn? Also bei Windows geht als Pfadangabe C:/irgendwas und C:[beliebig mehr backslashe]irgendwas, wobei in C++ erstere aufgrund der leichteren Verwendung von / einfacher ist. Ich check immer noch nicht wieso du das jetzt brauchst.

    Ja ich bin auf Windows aber

    f.open(folder+"\\\\"+ filename+".csv", ios::out|ios::app);
    

    braucht immer 2 Backslashes, weil es sonst "denkt", das der Slash zum datei name gehört und dann geht es nicht, weil Windows keine Dateien mit Slash im DAteiname erstellt.



  • SideWinder schrieb:

    BTW: Wenn du Boost nutzt kannst du http://www.boost.org/doc/libs/1_46_1/doc/html/boost/algorithm/replace_all.html einsetzen

    MfG SideWinder

    die Boost Biblithek hatte ich auch schon gesehen, aber erstmal wolle ich das mit den "Standard C++"-Mitteln machen.



  • Crysis_02 schrieb:

    Ja ich bin auf Windows aber

    f.open(folder+"\\\\"+ filename+".csv", ios::out|ios::app);
    

    braucht immer 2 Backslashes, weil es sonst "denkt", das der Slash zum datei name gehört und dann geht es nicht, weil Windows keine Dateien mit Slash im Dateiname erstellt.

    WTF?



  • Crysis_02 schrieb:

    Ja ich bin auf Windows aber

    f.open(folder+"\\\\"+ filename+".csv", ios::out|ios::app);
    

    braucht immer 2 Backslashes

    Du brauchst nur dann doppelte Backslashes, wenn du einen Backslash in einem Literal in deinem Code hast, denn dort leitet der Backslash eine Escape-Sequenz ein. Wenn der Pfad irgendwo anders herkommt (Benutzereingabe, Datei, API-Funktion usw.), ist das nicht notwendig.

    Dein ganzes Vorhaben ist grundlos. Wenn es bei dir trotzdem "nicht geht", liegt es an etwas anderem.


Log in to reply