AnsiReplaceStr prob bzw backslash problem



  • Hallo Ihr coding guru's 🙂

    Also erstmal hier mein code, damit ihr seht wovon ich rede:

    void __fastcall testlib(AnsiString path)
    {
     AnsiString     pfad,oldp,newp;
    
     oldp = "\\";
     newp = "\\\";
     ShowMessage(path);
     pfad = AnsiReplaceStr(path,oldp,newp);
     ShowMessage(pfad);
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     testlib("C:\dies\ist\nur\ein\test");
    }
    

    Mein problem ist jetzt das der compiler bei oldp = "\"; immer folgendes meckert:

    E2380: Nicht abgeschlossene String- Zeichen Konstante

    Was wohl daraus resultiert das er den letzen bzw zweiten backslash als sonderzeichen erkennt und demnach das abschließende > " < nicht als solches erkennt. Wie kann ich das verhindern ??? ich weiß wirklich nicht mehr weiter.

    Die FAQS und die Borland help, bringen irgendwie auch nischt.

    Vielen Dank im voraus

    PS: will ein Pfad damit umwandeln von z.B. "C:\dies\ist\ein\test" zu "C:\\dies\\ist\\ein\\test"



  • Ich blaube du hast das problem nicht ganz verstanden 😃
    Dein fehler leigt nicht in deiner Funktion, der liegt schon da wo du den Pfad eingibst! Dort musst du schon mit dem Doppelbackslash arbeiten, nicht dann noch in einer Funktion hinzufügen.
    Erklärung: der "\" hat eine Sonderfunktion, er bewirkt, dass das darauffolgende Zeichen eine Sonderbedeutung hat, und nicht als normales Zeichen interpretiert wird. Willst du nun wirklich einen "\" musst du "\" schrieben, im Speicher steht aber nur ein Zeichen!



  • Der Fehler stammt ja wohl offensichtlich aus der nächsten, der newp-Zeile.
    Um einen einfachen Backslash zu "escapen" brauchst du zwei Backslashes.
    Wieviele werden dann wohl für das Escapen eines Doppel-Backslashes benötigt?

    Davon abgesehen denke ich, dass du insgesamt auf dem Holzweg bist. Es gibt keinen vernünftigen Grund dafür, zur Laufzeit irgendwelche Backslashes durch doppelte zu ersetzen. Doppelte Backslashes werden allein für direkt im Quelltext stehende Pfadangaben benötigt, und das auch nur beim Eintippen in den Quelltext. Sämtliche zur Laufzeit z.B. aus Dateien gelesene oder vom Benutzer eingegebene Backslashes werden automatisch korrekt interpretiert.



  • Das ganze, was Zwerg23 beschrieben hat, nennt sich dann Escape-Sequenz 🙂

    Edit: Zu spät...



  • StarGate schrieb:

    Mein problem ist jetzt das der compiler bei oldp = "\"; immer folgendes meckert:

    Bist Du da sicher? Die Meldung sollte für newp ausgegeben werden da Du in newp "\\" schreibst. Du beginnst mit dem ersten " die Zeichenkonstante und definierst die beiden Sonderzeichen \\ und \", somit fehlt das abschließende ".

    EDIT: Viel zu spät. 🙂



  • PuppetMaster2k schrieb:

    Das ganze, was Zwerg23 beschrieben hat, nennt sich dann Escape-Sequenz 🙂

    Mir lags auf der Zunge 😃



  • Erstmal vielen vielen dank für eure Antworten 😉

    Also muß wohl mein Pfad-Prob in einer anderen Function liegen 😕

    Demnach heißt es wieder such-pfiffi-such für mich....hrmpf



  • such am Besten mal beim Testlib aufruf...

    -junix



  • Ne ne, das war nur so rumgeteste um zu sehen wie AnsiReplaceStr() funktioniert.

    Es muss in einer anderen Function in meinem ganzen Source sein. Irgendwo dort muss der Pfad falsch übergeben werden.

    Die ganze suche die ich mache geht über 3 Functionen.

    Aber trotzdem Danke 🙂



  • Hi SG,

    bist Du denn sicher, dass sich nicht doch \\ in dem übergebenen Stiring sind?
    Wenn Du den Pfad in einem Edit oder Label ausgibst wird nur ein Backslash dargestellt, obwohl 2 im String sind.

    Probier's mal aus:

    AnsiString Pfad = "C:\\test\\dummy.exe";
    Label1->Caption = Pfad;
    

    Grüße Joe_M.


Anmelden zum Antworten